CMAKE_LINK_LIBRARY_<FEATURE>_ATTRIBUTES¶
3.30 版本新增。
此变量定义了指定的链接库 <FEATURE> 的行为。它指定了该 <FEATURE> 如何与其他特性交互、何时应用该 <FEATURE>,以及当 CMake 组装最终链接器命令行时(例如去重)应如何处理该 <FEATURE> 的各个方面。
<FEATURE> 的链接器标志语法由 CMAKE_<LANG>_LINK_LIBRARY_<FEATURE> 和 CMAKE_LINK_LIBRARY_USING_<FEATURE> 变量控制。CMAKE_<LANG>_LINK_LIBRARY_<FEATURE>_SUPPORTED 和 CMAKE_LINK_LIBRARY_USING_<FEATURE>_SUPPORTED 变量控制该 <FEATURE> 是否可用。
当针对特定语言 <LANG> 进行链接时,如果同一个 <FEATURE> 也定义了 CMAKE_<LANG>_LINK_LIBRARY_<FEATURE>_ATTRIBUTES 变量,则 CMAKE_LINK_LIBRARY_<FEATURE>_ATTRIBUTES 将被忽略。
定义目标所在目录范围结束时的 CMAKE_LINK_LIBRARY_<FEATURE>_ATTRIBUTES 和 CMAKE_<LANG>_LINK_LIBRARY_<FEATURE>_ATTRIBUTES 的值才是起作用的值。
特性属性定义¶
特性属性定义是一个 分号分隔的列表,包含 attribute=value(s) 条目。如果一个属性有多个值,这些值必须用逗号分隔。
支持以下属性:
LIBRARY_TYPE=<library-type-list>指定该特性支持的库类型。支持的值有:
STATIC、SHARED、MODULE和EXECUTABLE。如果未指定此属性,则默认为
LIBRARY_TYPE=STATIC,SHARED,MODULE,EXECUTABLE。如果该特性与不支持的库类型一起使用,CMake 将发出开发者警告,并且该特性将被忽略。
OVERRIDE=<feature-list>指定在发生冲突时该特性可以替换哪些其他特性。如果定义了
LINK_LIBRARY_OVERRIDE或LINK_LIBRARY_OVERRIDE_<LIBRARY>目标属性定义,此覆盖机制将失效。如果未指定此属性,则默认为空列表。
DEDUPLICATION=YES|NO|DEFAULT指定使用此特性的库的去重策略。
是YES:该库总是被去重。CMake 通常应用的默认策略将被忽略。
否NO:该库从不去重。CMake 通常应用的默认策略将被忽略。
DEFAULTDEFAULT:让 CMake 自动确定去重策略。
如果未指定此属性,将使用
DEFAULT。
示例¶
一个常见的需求是在创建共享库时加载完整的归档文件。内置的 WHOLE_ARCHIVE 特性可用于此目的。该内置特性的实现设置了以下链接库特性属性:
set(CMAKE_LINK_LIBRARY_WHOLE_ARCHIVE_ATTRIBUTES
LIBRARY_TYPE=STATIC
OVERRIDE=DEFAULT
DEDUPLICATION=YES
)
LIBRARY_TYPE=STATIC此特性仅对静态库有意义。
OVERRIDE=DEFAULTDEFAULT特性将被WHOLE_ARCHIVE特性覆盖,因为它们是兼容的并提升了用户体验:可以自由使用标准库指定和$<LINK_LIBRARY:WHOLE_ARCHIVE>。DEDUPLICATION=YES当使用此特性时,链接器会加载静态库中的所有符号,因此无需在链接器命令行上重复该库。
WHOLE_ARCHIVE 特性可以如下使用:
add_library(A STATIC ...)
add_library(B STATIC ...)
target_link_libraries(B PUBLIC A)
target_link_libraries(A PUBLIC B)
add_library(global SHARED ...)
target_link_libraries(global PRIVATE $<LINK_LIBRARY:WHOLE_ARCHIVE,A>)
生成的链接命令将仅包含一个 A 库的实例,并且链接器标志将确保从 A 库中加载所有符号。