【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()
,export
和imported
,但可能没有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()