总结

写在前面,方便查看
1、cmake指令API文档:cmake指令 2、cmake指令中的常量:cmake变量 比如设置静态库和动态库输出目录的CMAKE_ARCHIVE_OUTPUT_DIRECTORY和CMAKE_LIBRARY_OUTPUT_DIRECTORY变量:

set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}")

2、add_library命令,写一条生成一个so库。
如果不想生成太多so库,那就用target_link_libraries将target都链接到一个library中。

一、cmake构建系统

1、Binary Targets

使用 add_executable() 和 add_library() 命令定义可执行文件和库。生成的二进制文件具有平台相关的前缀、后缀和扩展名。
二进制目标之间的依赖关系使用 target_link_libraries() 命令表示:

add_library(archive archive.cpp zip.cpp lzma.cpp)
add_executable(zipapp zipapp.cpp)
target_link_libraries(zipapp archive)

archive 被定义为静态库,包含从 archive.cpp,zip.cpp 和 lzma.cpp 编译产生的对象的归档文件。zipapp 被定义为通过编译和链接 zipapp.cpp 形成的可执行文件。zipapp 可执行文件链接时接入了 archive 静态库

二、add_library

使用指定的source文件,添加library到项目中。

1、 normal libraries

add_library(<name> [STATIC | SHARED | MODULE]
            [EXCLUDE_FROM_ALL]
            source1 [source2 ...])

添加一个名为 < name > ,由source1 [source2 …] 所指定的源文件构建出来的library。
1.1、< name > 具备逻辑指向意义外,还应保证在一个项目中的唯一性。
1.2、实际的library文件名基于Native平台的约定规则,比如:lib< name >.a, < name >.lib等
1.3、STATIC,SHARED,MODULE用于指定创建的library类型。
STATIC库:是object文件的归档,用于链接其他targets。
SHARED库:是动态链接,并于运行时加载。
MODULE库:不能链接到其他targets,但是可以用dlopen之类的方法在运行时动态加载。
1.4、如果没有明确指定上述类型,那么如果BUILD_SHARED_LIBS变量值为ON,则默认是SHARED,否则默认STATIC。
1.5、对于SHARED和MODULE类型的库,POSITION_INDEPENDENT_CODE属性自动置为ON。
1.6、EXCLUDE_FROM_ALL:表明该target是否从默认构建target中排除。
1.7、source参数可以使用generator表达式($ <…>)。
generator表达式
1.7.1 逻辑表达式:
$ <BOOL : …> : 如果…是true,则为1,否则为0.
$ <AND:?[,?]… > : 如果所有?都是1,则为1,否则为0.
$ <EQUAL:a,b > : 如果数字a等于数字b,则为1,否则为0.
1.7.2 信息表达式
$ <C_COMPILER_VERSION> : C compiler的版本.
$ <TARGET_FILE:tgt> : 名为tgt的主文件的全路径。
1.7.3 输出表达式
$ <0:…> : 输出空字符串,忽略…内容。
$ <1:…> : 输出…的内容。
$ <JOIN:list, … > :将…内容加到list上。

1.8、举例

add_library(native-lib, SHARED, app/src/main/cpp/native-lib.cpp)

2、 Imported libraries

add_library(<name> <SHARED|STATIC|MODULE|UNKNOWN> IMPORTED
            [GLOBAL])

2.1 一个IMPORTED target表示一个已经存在的依赖,且不可变的存在,无法修改它。
2.2 对于快捷引用命令(如,target_link_libraries() )来说,IMPORTED库很有用。
2.3 关于imported library的详细信息,是通过设置那些以IMPORTED_和INTERFACE_开头的属性来指定的。
其中最重要的属性是:IMPORTED_LOCATION,这个属性用于指定磁盘上主库文件的位置。
2.4示例:

add_library(PocoLib SHARED IMPORTED GLOBAL)

# It's important to specify the full path to the library you want to import
set_target_properties(PocoLib PROPERTIES IMPORTED_LOCATION "/usr/local/lib/Poco_1.7.2/lib/libPocoFoundation.so")

3、 Object libraries

add_library(<name> OBJECT <src>...)

4、 Alias libraries

add_library(<name> ALIAS <target>)

5、 Interface libraries

add_library(<name> INTERFACE [IMPORTED [GLOBAL]])

三、set_target_properties

set_target_properties(target1 target2 ...
                      PROPERTIES prop1 value1
                      prop2 value2 ...)