指定一组链接到目标的库,以及定义该组应如何链接的“功能”。例如:
add_library(lib1 STATIC ...)
add_library(lib2 ...)
target_link_libraries(lib2 PRIVATE "$<LINK_GROUP:RESCAN,lib1,external>")
这指定 lib2
应该链接到 lib1
和 external
,并且根据 RESCAN
特性的定义,这两个库都应该包含在链接器命令行中.
功能名称区分大小写,并且只能包含字母、数字和下划线。全部大写定义的功能名称保留给 CMake 自己的内置功能。目前,只有一个预定义的内置组功能:
重新扫描
一些链接器仅是单程的。对于此类链接器,库之间的循环引用通常会导致无法解析的符号。此功能指示链接器重复搜索指定的静态库,直到没有创建新的未定义引用为止。
通常,静态库只会按照在命令行中指定的顺序搜索一次。如果需要该库中的符号来解析由稍后出现在命令行中的库中的对象引用的未定义符号,则链接器将无法解析该引用。通过使用 RESCAN
特性对静态库进行分组,它们将被重复搜索,直到所有可能的引用都被解析。这将使用链接器选项,如``--start-group`` 和``--end-group``,或在 SunOS 上,-z rescan-start
和``-z rescan-end``。
使用此功能会产生显着的性能成本。最好只在两个或多个静态库之间存在不可避免的循环引用时才使用它。
当使用面向 Linux、BSD 和 SunOS 的工具链时,此功能可用。如果使用 GNU 工具链,它也可以在针对 Windows 平台时使用。
内置和自定义组功能根据以下变量定义:
用于这些变量中的每一个的值是在创建目标的目录范围末尾设置的值。用法如下:
如果特定于语言的 CMAKE_<LANG>_LINK_GROUP_USING_<FEATURE>_SUPPORTED
变量为真,则 feature
必须由相应的 CMAKE_<LANG>_LINK_GROUP_USING_<FEATURE>
变量定义。
如果不支持特定语言的“功能”,则 CMAKE_LINK_GROUP_USING_<FEATURE>_SUPPORTED
变量必须为真,并且“功能”必须由相应的 :variable:`CMAKE_LINK_GROUP_USING_<FEATURE> 定义`变量。
LINK_GROUP
生成器表达式与 LINK_LIBRARY
生成器表达式兼容。可以使用 LINK_LIBRARY 生成器表达式指定组中涉及的库。
链接步骤中涉及的每个目标或外部库都允许成为多个组的一部分,但前提是所有涉及的组都指定相同的“功能”。此类组不会在链接器命令行上合并,单个组仍会保留。禁止为同一目标或库混合不同的组特征。
add_library(lib1 ...)
add_library(lib2 ...)
add_library(lib3 ...)
add_library(lib4 ...)
add_library(lib5 ...)
target_link_libraries(lib3 PUBLIC "$<LINK_GROUP:feature1,lib1,lib2>")
target_link_libraries(lib4 PRIVATE "$<LINK_GROUP:feature1,lib1,lib3>")
# lib4 will be linked with the groups {lib1,lib2} and {lib1,lib3}.
# Both groups specify the same feature, so this is fine.
target_link_libraries(lib5 PRIVATE "$<LINK_GROUP:feature2,lib1,lib3>")
# An error will be raised here because both lib1 and lib3 are part of two
# groups with different features.
当目标或外部库作为组的一部分并且不属于任何组的一部分参与链接步骤时,非组链接项的任何出现都将被其所属的组替换。
add_library(lib1 ...)
add_library(lib2 ...)
add_library(lib3 ...)
add_library(lib4 ...)
target_link_libraries(lib3 PUBLIC lib1)
target_link_libraries(lib4 PRIVATE lib3 "$<LINK_GROUP:feature1,lib1,lib2>")
# lib4 will only be linked with lib3 and the group {lib1,lib2}
因为 lib1
是为 lib4
定义的组的一部分,所以该组将被应用回用于 lib3
的 lib1
。最终结果就像 lib3
的链接关系被指定为:
target_link_libraries(lib3 PUBLIC "$<LINK_GROUP:feature1,lib1,lib2>")
请注意,组优先于非组链接项可能会导致组之间的循环依赖关系。如果发生这种情况,则会引发致命错误,因为组不允许循环依赖。
add_library(lib1A ...)
add_library(lib1B ...)
add_library(lib2A ...)
add_library(lib2B ...)
add_library(lib3 ...)
# Non-group linking relationships, these are non-circular so far
target_link_libraries(lib1A PUBLIC lib2A)
target_link_libraries(lib2B PUBLIC lib1B)
# The addition of these groups creates circular dependencies
target_link_libraries(lib3 PRIVATE
"$<LINK_GROUP:feat,lib1A,lib1B>"
"$<LINK_GROUP:feat,lib2A,lib2B>"
)
由于为 lib3
定义的组,lib1A
和 lib2B
的链接关系有效地扩展为等同于:
target_link_libraries(lib1A PUBLIC "$<LINK_GROUP:feat,lib2A,lib2B>")
target_link_libraries(lib2B PUBLIC "$<LINK_GROUP:feat,lib1A,lib1B>")
这会在组之间创建循环依赖:lib1A --> lib2B --> lib1A
。
还应注意以下限制: