Cmake add_library命令
add_library
add_library命令用来使用指定的源文件向工程中添加一个目标库,主要有一下几种形式。
1. 普通库
1.1 命令形式
add_library(<name> [STATIC | SHARED | MODULE]
[EXCLUDE_FROM_ALL]
[<source>...])
- 添加一个从source列表列出的文件构建而来的目标名为name的库。
- name必须全局唯一
- 构建库的源文件可以直接指定,也可以后续使用target_sources()指定
- STATIC(静态库) SHARED(动态库) MODULE(模块库)用来指定库的类型。
-使用STATIC构建生成静态库(name.a),使用SHARED构建生成动态库(name.so)。
1.2 命令参数
- name:构建成的库名
- STATIC|SHARED|MOUDLE:库的类型
- EXCLUDE_FROM_ALL:加了EXCLUDE_FROM_ALL属性的target在默认编译的时候,不会被编译,如果要编译它们,需要手动编译
- source:构建库的文件
1.3 示例代码
add_library(hello_library STATIC
src/Hello.cpp
)
2. 对象库
2.1 命令形式
add_library(<name> OBJECT [<source>...])
这种形式类型固定为OBJECT,以这种方式,只编译source列表的文件,但不将生成的目标文件打包或者链接为库,而是在其他add_library()或者add_executable()生成目标的时候,可以使用形如$<TARGET_OBJECTS:objlib>的表达式将对象库作为源引入。
2.2 示例代码
使用方式:
add_library(<objlib> OBJECT [<source>...])
add_library(... $<TARGET_OBJECTS:objlib> ...)
add_executable(... $<TARGET_OBJECTS:objlib> ...)
具体示例:
add_library(test_library OBJECT a.cpp b.cpp c.cpp)
add_executable(test_app main.cpp $<TARGET_OBJECTS:my_library>)
add_library(anotherlib STATIC other.cpp $<TARGET_OBJECTS:my_library>)
test_library并没有被实际生成,使用test_library的目标文件的
生成表达式作为 参数放在add_library或者add_executable放源
代码的位置,而不能放在target_link_library的位置。
这种方式不常使用,因为静态库就是把文件打包,这种情况直接使用静态库就行,了解即可。
3. 接口库
3.1 命令形式
add_library(<name> INTERFACE [IMPORTED [GLOBAL]])
生成一个接口库,这类库不编译任何文件,也不在磁盘上产生库文件。它有一些属性被设置,并且能够被安装和导出。通常,使用以下命令在接口目标上填充属性。
- set_property() - target_link_library(INTERFACE) - target_link_options(INTERFACE) - target_include_directions(INTERFACE) - target_compile_options(INTERFACE) - target_compile_definitions(INTERFACE) - target_sources(INTERFACE)
然后像其他目标一样被用作参数给target_link_libraries()
4. 导入的库
4.1 命令形式
add_library(<name> <SHARED|STATIC|MODULE|UNKNOWN> IMPORTED
[GLOBAL])
- 用来导入已经存在的库,CMake也不会添加任何编译规则给它。
- 此类库的标志就是有IMPORT属性,导入的库的作用域为创建它的目录及更下级目录。但是如果有GLOBE属性,则作用域被拓展到全工程。
- 导入的库的类型必须是
STATIC, SHARED, MODULE, UNKNOWN
中的一种
对于UNKNOW类型,不需要知道类型就可使用的
从工程外部引入一个库,使用IMPORTED_LOCATION
属性确定库文件的在磁盘上的完整路径。
5. 别名库
5.1 命令形式
add_library(<name> ALIAS <target>)
为给定library添加一个别名,后续可使用
<name>
来替代<target>
。