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_开头,导入库的几个重要属性如下:

  1. IMPORTED_LOCATION:标明library在硬盘上的位置,可以用更具体的IMPORTED_LOCATION_的标注,其中的可以是DEBUG/RELEASE或其他
  2. IMPORTED_OBJECTS:标明对象library在硬盘上的位置,相应的有IMPORTED_OBJECTS_来标识具体编译类型
  3. 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用来链接导入库