由于以下警告:
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.
Run Code Online (Sandbox Code Playgroud)
这是来自这样的行的结果:
get_target_property(my_exe_path my_exe LOCATION)
Run Code Online (Sandbox Code Playgroud)
像在文档中推荐的那样,我尝试使用这样的生成器表达式:
add_executable(my_exe_path main.cpp)
message("path to executable: $<TARGET_FILE:my_exe_path>")
Run Code Online (Sandbox Code Playgroud)
但是TARGET_FILE没有被评估
path to executable: $<TARGET_FILE:my_exe>
Run Code Online (Sandbox Code Playgroud)
我正在使用CMake 3.4并添加cmake_minimum_required(VERSION 3.4)到我的CMakeLists.txt所以我做错了什么?
thi*_*wfx 14
这是一种快速简便的方法来打印生成器表达式的值:
add_custom_target(print
${CMAKE_COMMAND} -E echo $<1:hello> $<0:world>
)
Run Code Online (Sandbox Code Playgroud)
在此示例中,如果您运行cmake .然后make print,您将在输出中看到"hello"(不带引号).
但是,如果您只是使用message($<1:hello> $<0:world>),您将看到" $<1:hello> $<0:world>"作为输出(再次,没有引号).
当生成器表达式存储在配置阶段时(当执行相应的CMake命令时), 在构建阶段执行生成器表达式的评估.
这就是为什么message()命令以非解除引用的形式打印生成器表达式的原因:在此阶段不知道由生成器表达式表示的值.
而且,CMake本身从不取消引用生成器表达式.相反,它生成构建文件,然后由解释适当的字符串构建工具(make,Visual Studio等).
请注意,并非每个 CMake 命令都接受 生成器表达式.中的每一个可能的使用生成器表达式被明确地描述文档为特定的命令.此外,不同的CMake 命令流或不同的选项对于使用生成器表达式具有不同的策略.
例如,命令流
add_test(NAME <name> COMMAND <executable>)
Run Code Online (Sandbox Code Playgroud)
接受COMMAND选项的生成器表达式,
但命令流
add_test(<name> <executable>)
Run Code Online (Sandbox Code Playgroud)
不!
政策差异的另一个例子:
install(DIRECTORY <dir> DESTINATION <dest>)
Run Code Online (Sandbox Code Playgroud)
在此命令中,允许使用流生成器表达式DESTINATION,但不允许DIRECTORY选项.
再次,仔细阅读文档.