一、生成动态库或静态库
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
二、导入已经生成的库
add_library(<name> <type> IMPORTED [GLOBAL])
三、创建接口库
add_library(<name> INTERFACE [IMPORTED [GLOBAL]])
这类库有属性,能install()
,export
和imported
,但可能没有build过程。像纯头文件库
或完全针对target的设计
(这条参见interface libraries)
四、为库起别名
为给定library添加一个别名,后续可使用 <name>
来替代 <target>
。
add_library(<name> ALIAS <target>)
使用有如下限制:
- <target>不能是ALIAS
- 可用于判断target是否存在、链接。
- ALIAS的library不能修改属性,不能调用set_property(), set_target_properties()和target_link_libraries()等方法
- 不能用于install()
https://cmake.org/cmake/help/v3.22/command/add_library.html
https://www.cnblogs.com/sunbines/p/16147873.html
cmake : add_library详解_cmake add library-优快云博客
3. cmake:EXCLUDE_FROM_ALL的用处