由于以下警告:
CMake Error at test/CMakeLists.txt:29 (get_target_property):
The LOCATION property may not be read from target "my_exe". Use the
target name directly with add_custom_command, or use the generator
expression $<TARGET_FILE>, as appropriate.
这是来自这样的行的结果:
get_target_property(my_exe_path my_exe LOCATION)
与文档中推荐的一样,我尝试使用这样的生成器表达式:
add_executable(my_exe_path main.cpp)
message("path to executable: $<TARGET_FILE:my_exe_path>")
但TARGET_FILE
未被评估
path to executable: $<TARGET_FILE:my_exe>
我正在使用CMake 3.4并将cmake_minimum_required(VERSION 3.4)
添加到我的CMakeLists.txt
,所以我做错了什么?
答案 0 :(得分:12)
这是一种打印生成器表达式值的快捷方法:
add_custom_target(print
${CMAKE_COMMAND} -E echo $<1:hello> $<0:world>
)
在此示例中,如果您运行cmake .
然后make print
,您将看到&#34; hello&#34; (在输出中没有引号)。
但是,如果您只使用message($<1:hello> $<0:world>)
,则会看到&#34; $<1:hello> $<0:world>
&#34;作为输出(再次,没有引号)。
答案 1 :(得分:5)
当生成器表达式存储在配置阶段时(执行相应的CMake命令时), 生成器表达式的评估在构建阶段执行。
这就是为什么message()
命令以非解除引用的形式打印生成器表达式的原因:生成器表达式表示的值在此阶段不知道。
此外,CMake本身从不取消引用生成器表达式。相反,它会在构建文件中生成适当的字符串,然后由构建实用程序(make
,Visual Studio
等)进行解释。
请注意,并非每个 CMake 命令都接受 生成器表达式。对于特定命令,生成器表达式的每种可能用法都在documentation中描述为明确。此外,不同的CMake 命令流或不同的选项有不同的策略关于使用生成器表达式。
例如,命令流
add_test(NAME <name> COMMAND <executable>)
接受<{1}}选项的生成器表达式,
但命令流
COMMAND
没有按&#39;!吨
政策差异的另一个例子:
add_test(<name> <executable>)
在此命令中,流install(DIRECTORY <dir> DESTINATION <dest>)
允许表达式生成器表达式,但不允许DESTINATION
选项。
再次,仔细阅读文档。