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>

猜你喜欢

转载自blog.csdn.net/mataojie/article/details/121466125