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(VERSION 3.4.1)
指定cmake最低支持的版本,可以省略
aux_source_directory(. DIR_SRCS)
- 查找当前目录所有源文件,并将源文件名称列表保存到DIR_SRCS变量
- 不能查找子目录
- 第一次参数:指定查找的目录
- 第二个参数:保存列表的变量
add_library
添加一个库
add_library(name
STATIC|SHARED|MODULE
EXCLUDE_FROM_ALL
source1 source2 ... sourceN)
add_library(
native-lib
SHARED
native-lib.cpp )
- 添加一个库文件,名字为name
- 指定库的类型。STATIC:静态库;SHARED:动态库;MODULE:在使用dyld系统有效,否则等同于SHARED
- EXCLUDE_FROM_ALL:表示该库不会被默认构建
- source1 source2 ... sourceN 指定库的源文件
导入预编译库
add_library(name
STATIC|SHARED|MODULE|UNKNOWN
IMPORTED
)
add_library(test
SHARED
IMPORTED
)
set_target_properties(
test #指明目标库名
PROPERTIES IMPRORTED_LOCATION #指明要设置的参数库路径/${ANDROID_ABI}/
libtest.so #导入库的路径
)
set 设置变量
- set(EXECUTABLE_OUTPUT_PATH [output_path])
设置可执行文件的输出路径,EXECUTABLE_OUTPUT_PATH 是全局变量 - set(LIBRARY_OUTPUT_PATH [output_path])
设置库文件的输出路径,LIBRARY_OUTPUT_PATH 是全局变量 - set(CMAKE_CXX_FLAGS "-Wall sta=c++11")
设置C++编译参数,CMAKE_CXX_FLAGS 是全局变量 - set(SOURCE_FILES main.cpp test.cpp ...)
设置源文件集合,SOURCE_FILES 是本地变量
include_directories
include_directories(./include ${MY_INCLUDE})
- 设置头文件目录
- 相当于g++选项中的-l参数
-可以用相对或绝对路径,也可以使用自定义变量
add_executable
add_executable(name $(SRC_LIST))
添加可执行文件
target_link_libraries
target_link_libraries(name lib1 lib2 lib3)
- 将若干库链接到目标库文件
- 链接顺序应当符合gcc链接顺序规则,被链接库放在依赖它的库后面,如lib1依赖于lib2,lib2依赖于lib3,那么上诉命令必须按照lib1 lib2 lib3排列
- 如果出现相互依赖的静态库,CMake会允许依赖图中包含循环依赖如
add_library(A STATIC a.c)
add_library(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_definitions
add_definitions(-DF00 -DDEBUG ...)
为当前路径以及子目录的源文件加入由-D引入的define flag
add_subdirectory
add_subdirectory(sub_dir [binary_dir])
- 如果当前目录下还有子目录时,可以使用add_subdirectory,子目录中也需要包含CMakeLists.txt
- sub_dir指定包含CMakeLists.txt和源码文件的子目录位置
- binary_dir输出路径,一般可以不指定
set_directory_properties
set_directory_properties(PROPERTIES prop1 value1 prop2 value2)
- 设置某个路径的一种属性
- prop1 prop2代表属性:
INCLUDE_DIRECTORIES
LINK_DIRECTORIES
INCLUDE_REGULAR_EXPRESSION
ADDITIONAL_MAKE_CLEAN_FILES
set_property
set_property(<GLOBAL |
DIRECTORY [dir] |
TARGET [target1 [target2 ...]] |
SOURCE [src1 [src2 ...]] |
TEST [test1 [test2 ...]] |
CACHE [entry1 [entry2 ...]]>
[APPEND][APPEND_STRING]
PROPERTY <name>[value1 [value2 ...]])
- 在给定的作用域内设置一个命名的属性
- PROPERTY 参数是必须的
- 第一个参数决定了属性可以影响的作用域
GLOBAL:全局作用域
DIRECTORY:默认当前路径,也可以用[dir]指定路径
TARGET:目标作用域,可以是0个或多个已有目标
SOURCE:源文件作用域,可以是0个或多个源文件
TEST:测试作用域,可以是0个或多个
CACHE:必须指定0个或多个cache中已有的条目
find_library
find_library(
log-lib
log)
查找系统库,这里查找的是系统日志库,并赋值给变量log-lib.
目录位置:ndk-bundle\platforms\android-21\arch-arm\usr\lib\liblog.so
多个源文件处理
aux_source_directory(. DIR_SRCS)
# file(GLOB DIR_SRCS *.c *.cpp)
add_library(
native-lib
SHARED
${DIR_SRCS})
使用aux_source_directory或者file命令查找指定目录下所有源文件,存进指定的变量DIR_SRCS
多目录多个源文件处理
aux_source_directory(. DIR_SRCS)
add_subdirectory(child)
add_library(
native-lib
SHARED
${DIR_SRCS})
target_link_libraries(native-lib child)
-------------------------------------------------------
#child目录与下的CMakeLists.txt
aux_source_directory(. DIR_LIB_SRCS)
add_library(
child
SHARED
${DIR_LIB_SRCS})
- add_subdirectory(child)指明本项目包含一个子项目child
- target_link_libraries(native-lib child)指明本项目需要链接一个名为child的库
添加预编译库
add_library(
imported-lib
SHARED
IMPORTED )
set_target_properties(
imported-lib
PROPERTIES
IMPORTED_LOCATION
路径/libimported-lib.so)
aux_source_directory(. DIR_SRCS)
add_library(
native-lib
SHARED
${DIR_SRCS})
target_link_libraries(native-lib imported-lib)
- add_library命令,第一个参数是模块名,第二个参数表示是动态库,第三个参数IMPORTED表示以导入的形式添加
- set_target_properties设置导入路径属性。参数分别是:库、属性、导入地址、库所在地址
- target_link_libraries表示native-lib需要链接imported-lib
Android6.0以上使用set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -L[SO所在目录]")
- CMAKE_C_FLAGS :c的参数,会传递给编译器
- 如果是c++文件,需要使用CMAKE_CXX_FLAGS
- -L:库的查找路径
添加头文件目录
include_directories(文件目录)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}" -L[SO所在目录])
aux_source_directory(. DIR_SRCS)
add_library(
native-lib
SHARED
${DIR_SRCS})
target_link_libraries(native-lib imported-lib)
网友评论