1、add_library
创建库
add_library是cmake中最重要的一个函数,其功能是使用指定的源文件向工程中创建链接文件一般是库,用法格式如下:
add_library(<name> [STATIC | SHARED | MODULE]
[EXCLUDE_FROM_ALL]
[source1] [source2 ...])
name:库的名字
STATIC(静态库)/SHARED(动态库)/MODULE(模块库)之一:指定动态库的类型
添加的库会被输出到以下几个目录
ARCHIVE_OUTPUT_DIRECTORY, LIBRARY_OUTPUT_DIRECTORY和 RUNTIME_OUTPUT_DIRECTORY,详见cmake 常用设定及函数
设置EXCLUDE_FROM_ALL,可使这个library排除在all之外,即必须明确点击生成才会生成。
导入库
add_library(<name> <SHARED|STATIC|MODULE|OBJECT|UNKNOWN> IMPORTED
[GLOBAL])
这种用法可以直接导入已经生成的库,cmake不会给这类library添加编译规则。
这种用法的关键在于添加变量IMPORTED。
另外,GLOBAL可用于设置这个library为全局可见。
imported的library,其属性以IMPORTED_开头,导入库的几个重要属性如下:
- IMPORTED_LOCATION:标明library在硬盘上的位置,可以用更具体的IMPORTED_LOCATION_的标注,其中的可以是DEBUG/RELEASE或其他
- IMPORTED_OBJECTS:标明对象library在硬盘上的位置,相应的有IMPORTED_OBJECTS_来标识具体编译类型
- PUBLIC_HEADER:如果install这个library的话,这个值保存头文件的目录
2、set_target_properties
为一个目标设置属性。该命令的语法是列出所有你想要变更的文件,然后提供你想要设置的值。你能够使用任何你想要的属性/值对,并且在随后的代码中调用GET_TARGET_PROPERTY命令取出属性的值。
set_target_properties(target1 target2 ...
PROPERTIES
prop1 value1
prop2 value2 ...
)
举例设置共享库的路径:
set_target_properties( Thirdlib
PROPERTIES
IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/jniLibs/libThirdlib.so
)
3、include_directories
cmake使用 include_directories是用来 提供搜索头文件路径
cmake本身不提供任何搜索库的便捷方法,所有搜索库并给变量赋值的操作必须由cmake代码完成
4、link_directories
该指令的作用主要是指定要链接的库文件的路径,该指令有时候不一定需要。因为find_package和find_library指令可以得到库文件的绝对路径。不过你自己写的动态库文件放在自己新建的目录下时,可以用该指令指定该目录的路径以便工程能够找到。
link_directories( ${PROJECT_PATH}/lib )
5、target_link_libraries
该指令的作用为将目标文件与库文件进行链接。该指令的语法如下:
target_link_libraries(<target> [item1] [item2] [...]
[[debug|optimized|general] <item>] ...)
上述指令中的是指通过add_executable()和add_library()指令生成已经创建的目标文件。而[item]表示库文件没有后缀的名字。默认情况下,库依赖项是传递的。当这个目标链接到另一个目标时,链接到这个目标的库也会出现在另一个目标的连接线上。这个传递的接口存储在interface_link_libraries的目标属性中,可以通过设置该属性直接重写传递接口。
link_libraries用在add_executable之前,target_link_libraries用在add_executable之后,link_libraries用来链接静态库,target_link_libraries用来链接导入库