【cmake】add_library

 生成动态库或静态库

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

STATIC: 生成静态库

SHARED: 生成动态库

EXCLUDE_FROM_ALL:add_library, add_executable, add_subdirectory等命令都有一个EXCLUDE_FROM_ALL参数. 作用就是如果某个target或subdirectory被设置为EXCLUDE_FROM_ALL属性, 那么这个target(或这个subdirectory中的所有target)就会被排除在all target列表之外,这样,当执行默认的make时,这个target(或这个subdirectory中的所有target)就不会被编译。

 

 

1. 测试用例

 add_library(sub src/sublib1.cpp)

 说明: 当不指明库的类型时,生成静态sub。

 

2. 测试用例

add_library(cmimpl SHARED ${CMIMPL_SOURCE_FILES})
add_library(cmjnidrv SHARED ${JNI_SOURCE_FILES})

# fctest指定了EXCLUDE_FROM_ALL 属性,不会自动编译,只能手动编译
add_executable(fctest EXCLUDE_FROM_ALL FeatureCompareSpeedTest.cpp)

 说明:加了EXCLUDE_FROM_ALL属性的target在默认编译时不会被编译,如果要编译,需要手动编译, 比如make fctest指定编译名为fctest

 

用例2:

导入已经生成的库

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

 

创建接口库

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

 这类库有属性,能install()exportimported,但可能没有build过程。像纯头文件库完全针对target的设计(这条参见interface libraries



为库起别名

为给定library添加一个别名,后续可使用 <name> 来替代 <target>

add_library(<name> ALIAS <target>)

使用有如下限制:

    1. <target>不能是ALIAS

    2. 可用于判断target是否存在、链接。

    3. ALIAS的library不能修改属性,不能调用set_property(), set_target_properties()和target_link_libraries()等方法

    4. 不能用于install()

 

 

参考资料

1. cmake : add_library详解

2. cmake官方文档

3. cmake:EXCLUDE_FROM_ALL的用处

posted @ 2022-04-15 10:23  苏格拉底的落泪  阅读(3230)  评论(0编辑  收藏  举报