INTERFACE_LINK_LIBRARIES¶
列出库的公共接口库。
此属性包含传递链接依赖项的列表。当使用 target_link_libraries() 命令将目标链接到另一个目标时,所列出的库(以及递归获取的其链接接口库)也将提供给另一个目标。如果策略 CMP0022 设置为 OLD 或未设置,则此属性会被 LINK_INTERFACE_LIBRARIES 或 LINK_INTERFACE_LIBRARIES_<CONFIG> 属性覆盖。
生成器在构建依赖目标的链接规则时会使用此属性的值。依赖目标的直接链接依赖项(由其 LINK_LIBRARIES 目标属性指定)会首先被链接,随后是来自直接依赖项的 INTERFACE_LINK_LIBRARIES 属性的传递闭包中的间接依赖项。参见策略 CMP0022。
INTERFACE_LINK_LIBRARIES 的内容可以使用语法为 $<...> 的“生成器表达式”。有关可用表达式,请参阅 cmake-generator-expressions(7) 手册。有关定义构建系统属性的更多信息,请参阅 cmake-buildsystem(7) 手册。
注意
调用 target_link_libraries(<target> ...) 可能会更新 <target> 上的此属性。如果 <target> 不是在调用所在的同一目录中创建的,那么 target_link_libraries() 会将每个条目封装为 ::@(directory-id);...;::@ 格式,其中 ::@ 是字面量,而 (directory-id) 未指定。这会告诉生成器,必须在调用者的作用域内查找指定的库,而不是在创建 <target> 的作用域内查找。有效的目录 ID 在通过 install(EXPORT) 和 export() 命令进行导出时会被剥离。
INTERFACE_LINK_LIBRARIES 为目标的依赖项添加了传递链接依赖项。在高级用例中,可以使用 INTERFACE_LINK_LIBRARIES_DIRECT 和 INTERFACE_LINK_LIBRARIES_DIRECT_EXCLUDE 目标属性来更新目标的依赖项的直接链接依赖项。
处理编译器驱动器差异¶
4.0 版本新增。
要向链接器工具传递选项,每个编译器驱动程序都有其特定的语法。可以使用 LINKER: 前缀和 , 分隔符以可移植的方式指定传递给链接器工具的选项。LINKER: 会被替换为适当的驱动程序选项,, 会被替换为适当的驱动程序分隔符。驱动程序前缀和驱动程序分隔符由 CMAKE_<LANG>_LINKER_WRAPPER_FLAG 和 CMAKE_<LANG>_LINKER_WRAPPER_FLAG_SEP 变量的值给出。
例如,对于 Clang,"LINKER:-z,defs" 会变成 -Xlinker -z -Xlinker defs;对于 GNU GCC,则会变成 -Wl,-z,defs。
LINKER: 前缀支持使用 SHELL: 前缀和空格作为分隔符来指定参数,作为一种替代语法。前面的示例将变为 "LINKER:SHELL:-z defs"。
注意
不支持在 LINKER: 前缀的开头以外的任何位置指定 SHELL: 前缀。
创建可重定位包¶
请注意,不建议在目标的 INTERFACE_LINK_LIBRARIES 中填入依赖项的绝对路径。这会将**在制作软件包的机器上找到的**依赖项库文件路径硬编码到已安装的软件包中。
有关创建可重定位包(relocatable packages)时在指定使用需求时需要注意的额外事项的讨论,请参阅 cmake-packages(7) 手册的 创建可重定位包 部分。