在描述生成器表达式的CMake文档中有一个段落:
$<TARGET_NAME:...>将...标记为目标的名称。--如果将目标导出到多个依赖导出集,则这是必需的。...必须是目标的字面名称-它可能不包含生成器表达式。
我正在试着理解突出的部分。
首先,我想看看我是否正确地理解了依赖导出集的概念。如果目标B依赖于目标A,如果导出集EXP_A包含目标A,而导出集EXP_B包含目标B,则导出集EXP_B依赖于导出集EXP_A。这是正确的吗?
为什么$<TARGET_NAME:...>“如果将目标导出到多个依赖的导出集()”则需要?
发布于 2021-07-08 20:50:00
我不知道他们所说的“多重依赖出口集”是什么意思。我看了他们的测试套件,却找不到这样的东西。我也很困惑。
但是,我可以给出一个例子,说明$<TARGET_NAME:...>实际上做了些什么。考虑:
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中)。
https://stackoverflow.com/questions/51231665
复制相似问题