[cmake][转载]add_library详解

add_library是写cmake必备的一个函数,但一直没仔细研究过,今天把它折解下。主要参考
cmake官方文档

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

添加名为name的库,库的源文件可指定,也可用target_sources()后续指定。
库的类型是STATIC(静态库)/SHARED(动态库)/MODULE(模块库)之一。

name属性必须全局唯一
生成的library名会根据STATIC或SHARED成为name.a或name.lib
这里的STATIC和SHARED可不设置,通过全局的BUILD_SHARED_LIBS的FALSE或TRUE来指定
windows下,如果dll没有export任何信息,则不能使用SHARED,要标识为MODULE

添加的库会被输出到以下几个目录
ARCHIVE_OUTPUT_DIRECTORY, LIBRARY_OUTPUT_DIRECTORY和 RUNTIME_OUTPUT_DIRECTORY,详见cmake 常用设定及函数
设置EXCLUDE_FROM_ALL,可使这个library排除在all之外,即必须明确点击生成才会生成

imported library
add_library(<name> <SHARED|STATIC|MODULE|OBJECT|UNKNOWN> IMPORTED
            [GLOBAL])

这种用法直接导入已经生成的库,cmake不会给这类library添加编译规则。
这种用法的关键在于添加变量IMPORTED。
另外,GLOBAL可用于设置这个library为全局可见。
常规和imported的library的属性不同:

常规的library,其属性以INTERFACE_开头
imported的library,其属性以IMPORTED_开头
INTERFACE_和IMPORTED_开头的变量有哪些,参见interface libraries,还需再研究。

imported的library最重要的几个属性是:

IMPORTED_LOCATION:标明library在硬盘上的位置,可以用更具体的IMPORTED_LOCATION_<CONFIG>的标注,其中的<CONFIG>可以是DEBUG/RELEASE或其他
IMPORTED_OBJECTS:标明对象library在硬盘上的位置,相应的有IMPORTED_OBJECTS_<CONFIG>来标识具体编译类型
PUBLIC_HEADER:如果install这个library的话,这个值保存头文件的目录
UNKNOWN类型,在不需要明确library类型时使用。

object library
add_library(<name> OBJECT <src>...)
库的类型固定为OBJECT,这种库编译了源文件,但不链接。实际中没用过,没有仔细研究。使用方法:

add_library(... $<TARGET_OBJECTS:objlib> ...)
add_executable(... $<TARGET_OBJECTS:objlib> ...)
alias library(别名库)
为给定library添加一个别名,后续可使用<name>来替代<target>。

add_library(<name> ALIAS <target>)
使用有如下限制:

<target>不能是ALIAS
可用于判断target是否存在、链接。
ALIAS的library不能修改属性,不能调用set_property(), set_target_properties()和target_link_libraries()等方法
不能用于install()
interface library
创建一个接口库,

add_library(<name> INTERFACE [IMPORTED [GLOBAL]])
这类库有属性,能install(),export和imported,但可能没有build过程。像纯头文件库或完全针对target的设计(这条参见interface libraries)
所有INTERFACE _*属性从如下几个方法中设置
set_property()、target_link_libraries(INTERFACE)、target_link_options(INTERFACE)、target_include_directories(INTERFACE)、target_compile_options(INTERFACE)、target_compile_definitions(INTERFACE)和target_sources(INTERFACE)。

手工配置库
参考 cmake引入外部库

静态库

add_library(baz STATIC IMPORTED)
set_target_properties(baz PROPERTIES
IMPORTED_LOCATION_RELEASE ${CMAKE_CURRENT_SOURCE_DIR}/libbaz.a
IMPORTED_LOCATION_DEBUG ${CMAKE_CURRENT_SOURCE_DIR}/libbazd.a)

静态库(添加依赖项)

add_library(bar STATIC IMPORTED)
set_target_properties(bar PROPERTIES
IMPORTED_LOCATION_RELEASE ${CMAKE_CURRENT_SOURCE_DIR}/libbar.a
IMPORTED_LOCATION_DEBUG ${CMAKE_CURRENT_SOURCE_DIR}/libbard.a
IMPORTED_LINK_INTERFACE_LIBRARIES baz) # <-- dependency is here

动态库

add_library(bar SHARED IMPORTED)
set_property(TARGET bar PROPERTY IMPORTED_LOCATION c:/path/to/bar.dll)
set_property(TARGET bar PROPERTY IMPORTED_IMPLIB c:/path/to/bar.lib) # 多了lib信息
add_executable(myexe src1.c src2.c)
target_link_libraries(myexe bar)

当然,也可以直接引用库文件

TARGET_LINK_LIBRARIES(skiaSampleCode
debug skiaCored.lib
optimized skiaCore.lib)
原文链接:https://blog.csdn.net/LaineGates/article/details/108242803

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FL1623863129

你的打赏是我写文章最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值