首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TARGET_NAME生成器表达式的用途是什么?

TARGET_NAME生成器表达式的用途是什么?
EN

Stack Overflow用户
提问于 2018-07-08 11:45:42
回答 1查看 1.9K关注 0票数 6

描述生成器表达式的CMake文档中有一个段落:

$<TARGET_NAME:...>...标记为目标的名称。--如果将目标导出到多个依赖导出集,则这是必需的。...必须是目标的字面名称-它可能不包含生成器表达式。

我正在试着理解突出的部分。

首先,我想看看我是否正确地理解了依赖导出集的概念。如果目标B依赖于目标A,如果导出集EXP_A包含目标A,而导出集EXP_B包含目标B,则导出集EXP_B依赖于导出集EXP_A。这是正确的吗?

为什么$<TARGET_NAME:...>“如果将目标导出到多个依赖的导出集()”则需要?

EN

回答 1

Stack Overflow用户

发布于 2021-07-08 20:50:00

我不知道他们所说的“多重依赖出口集”是什么意思。我看了他们的测试套件,却找不到这样的东西。我也很困惑。

但是,我可以给出一个例子,说明$<TARGET_NAME:...>实际上做了些什么。考虑:

代码语言:javascript
复制
cmake_minimum_required(VERSION 3.20)
project(test)

add_library(define_a INTERFACE)
target_compile_definitions(define_a INTERFACE A)

add_library(define_a_tgt INTERFACE)
target_compile_definitions(define_a_tgt INTERFACE "A_TGT=\"$<TARGET_NAME:define_a>\"")

include(GNUInstallDirs)

install(TARGETS define_a define_a_tgt EXPORT test)
install(
  EXPORT test
  DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/test
  FILE test-config.cmake
  NAMESPACE test::
)

在这里,我们有两个愚蠢的INTERFACE库。第一个是define_a,简单地将-DA传播到目标链接到它。第二,define_a_tgt添加了A_TGT的定义,使其等于包含目标define_a名称的字符串。

在构建接口中,这将扩展到简单的define_a,但是在导出它之后,CMake将用test::define_a代替$<TARGET_NAME:define_a> (因为NAMESPACE参数到install(EXPORT))。

这是有点人为的,但它确实显示了一个CMake还不知道目标正在被命名的实例(它会自动转换target_link_libraries目标,而不需要这个genex)。另一个实例在其他生成器表达式中(甚至在target_link_libraries中)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51231665

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档