CMakeList 文件
使用AS創建一個C/C++ support的項目,會默認在app/src/main 目錄下生產cpp目錄,里面包含CMakeLists.txt 和 native-lib
.cpp.
下邊為CMakeLists.txt去掉英文注釋格式化后的內容
cmake_minimum_required(Version 3.4.1)
add_library(
? ? ? ? ? native-lib
? ? ? ? ? SHARED
? ? ? ? ? native-lib.cpp
)
find_library(
? ? ? ? ? log-lib
? ? ? ? ? log
)
target_link_libraries(
? ? ? ? ? ?native-lib
? ? ? ? ? ?${log-lib}
)
?
常用命令:
cmake_minimum_required(3.4.1)?
支持的最低版本
?
aux_source_directory(. DIR_SRCS) ?
查找當前目錄所有源文件,并將源文件名稱列表保持到 DIR_SRCS 變量
不能查找子目錄
?
add_library
添加一個庫
add_library(<name> [STATIC| SHARD | MODULE] [EXCLUDE_FORM_ALL] source1 source2 .. sourceN)
添加一個庫文件,名為<name>
指定STATIC、 SHARD、 MIDULE 參數來指定庫的類型 STATIC 靜態庫; SHARD 動態庫;MODULE:在使用dyld的系統有效,若不支持dyld,等同于 SHARD
EXCLUDE_FORM_ALL:表示該庫不會被默認構建
soruce1 source2.... sourceN:指定庫的源文件
?
導入預編譯庫
add_library(<name> <SHARED | STATIC | MODULE | UNKNOWN> IMPORTED)
添加一個已存在的預編譯庫,名為<name>
一般配合 set_target_properties 使用
比如:
add_library(test SHARD IMPORTED)
set_target_properties(
? ? test #指定目標庫名
? ? PROPERTIES IMPORTED_LOACATION #指明要設置的參數庫路徑
? ? /${ANDROID_ABI}/libtest.so #導入庫的路徑
)
?
set
設置變量
#設置可執行文件的輸出路徑 EXCUTABLE_OUTPUT_PATH是全局變量
set(EXCUTABLE_OUTPUT_PATH [output_path])
#設置庫文件的輸出路徑 LIBARARY_OUTPUT_PATH 是全局變量
set(LIBARARY_OUTPUT_PATH ?[output_path])
#設置C++ 編譯參數
set(CMAKE_CXX_FLAGS "-Wall std=c++11")
#設置源文件集合
ser(SOURCE_FILES main.cpp test.cpp ...)
?
include_directories
設置頭文件目錄,相當于g++ 選項中的 -I 參數
# 可以使用相對路徑或絕對路徑,也可以使用自定義的變量值
include_dirctories(./inuclude ${MY_INCLUDE})
?
add_excutable
添加可執行文件
add_excutable(<name> ${SRC_LIST})
?
tartget_list_libraries
將若干庫鏈接到目標庫文件
鏈接的順序應當符合gcc鏈接順序規則,被鏈接的庫放在依賴他的庫的后面。
target_link_libarries(<name> lib1 lib2 lib3)
# 如果出現相互依賴的靜態庫, CMake會允許依賴庫中包含循環依賴
add_library(A STATIC a.c)
add_libarry(B STATIC b.c)
target_link_libraries(A B)
target_link_libraries(B A)
add_executable(main main.c)
target_link_libraries(main A)
?
add_subdirctory
如果當前目錄下還有子目錄時可以使用add_subdirectory, 子目錄中也需要包含有 CMakeLists.txt
# sub_dir 指定包含CMakeLists.txt 和源碼文件的子目錄位置
# binary_dir 是輸出路徑,一般可以不指定
add_dubdirecroty(sub_dir [binary_dir])
?
file
文件操作命令
?
set_directory_porperties
設置某個路徑的一種屬性
set_direcory_properties(PROPERTIES prop1 vaules1 prop2 values)
prop1 prop2 代碼屬性,取值為:
INCLUDE_DIRECORIES
LINK_DIRECORIES
INCLUDE_REGULAR_EXPRESSION
ADDITIONAL_MAKE_CLEAN_FILES
?
set_property
在給定的作用域內設置一個命名的屬性
set_property(
? ? <GLOBAL | DIRECORY [dir] | TARGET [target ...] | SOURCE [ src1 ...] | TEST [test1.. ]
? ? | CACHE [entry1...]>
? ? [APPEND]
? ? PROPETY <name> [value...])?
)
??GLOBAL:全局作用域
? ??DIRECORY:默認當前路徑,也可以用 [dir] 指定路徑
? ??TARGET:目標作用域,可以是0 或者多個已有目標
SOURCE: 源文件作用域,可以是0個或多個源文件
TEST: 測試作用域,可以是0個或多個已有測試
CACHE:必須指定0個或多個cache中已有的條目
?
常見命令的使用
多個源文件處理
如果源文件很多,把所有文件一個一個加入很麻煩,
可以使 aux_source_directory命令或file命令,會查找指定目錄下的所有源文件,然后將結果存進指定變量名
cmake_minimum_required(VERSINO 3.4.1)
# 查找當前目錄所有源文件,并將名稱保存到 DIR_SRSC 變量
# 不能查找子目錄
aux_source_directory(. DIR_SRSC )
# 也可以使用file
file (GLOB DIR_SRC *.c *.cpp)
add_library(native-lib SHRAD &{DIR_SRCS})
?
多個目錄多源文件處理
?
添加預編譯庫(Android6.0 版本以前)
?
android6.0 版本以后
?
添加頭文件目錄
?
Build.gradle配置
可以在gradle中使用arguments 設置一些配置
CmakeList 配置文件
?
總結
以上是生活随笔為你收集整理的CMakeList 文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电大本科计算机考试,电大本科计算机考试
- 下一篇: 删除 SQL Server 的默认实例