在CMake documentation describing generator expressions中有以下段落:
$<TARGET_NAME:...>
将
...
标记为目标名称。 如果将目标导出到多个相关的导出集,这是必需的。...
必须是目标的文字名称-它不能包含生成器表达式。
我试图理解突出显示的部分。
首先,我想看看我是否正确理解了依赖导出集的概念。如果目标B
取决于目标A
,并且导出集 EXP_A
是否包含目标A
和导出集 {{ 1}}包含目标EXP_B
,则导出集 B
取决于导出集 EXP_B
。这是正确的吗?
为什么EXP_A
“ 是否需要将目标导出到多个从属导出集”?
谢谢。
答案 0 :(得分:0)
我不确定“多个依赖导出集”是什么意思。我查看了他们的测试套件,找不到类似的东西。这也让我很困惑。
但是,我可以举一个例子,说明 $<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
名称的 string。
在构建界面中,这将扩展为简单的 define_a
,但在导出后,CMake 会将 $<TARGET_NAME:define_a>
替换为 test::define_a
(由于 NAMESPACE
参数为install(EXPORT)
).
这有点做作,但它确实显示了一个实例,其中 CMake 还没有意识到正在命名目标(它会自动转换 target_link_libraries
目标,没有这个基因)。另一个例子是inside 其他生成器表达式(甚至在 target_link_libraries
中)。