CMake列表基本上只是以分号分隔的字符串,但是如果将这样的变量传递给命令,它会扩展为多个参数 - 例如,
set(FLAGS f1 f2 f3)
# now FLAGS == 'f1;f2;f3'
add_custom_command(
...
COMMAND my_cmd ${FLAGS}
...
)
将正确拨打my_cmd f1 f2 f3
。
现在,如果我这样做
set_target_properties(
myTarget PROPERTIES
LINK_FLAGS "${LD_FLAGS}"
)
扩展没有发生,我最终得到一个包含分号的LD_FLAG - 没用,而不是将它扩展为以空格分隔的字符串。
有没有办法让它当我将列表传递给LINK_FLAGS属性(或任何属性)时,它会扩展为多个参数而不只是一个?
谢谢, 丹
答案 0 :(得分:16)
我认为set_target_properties
不能自动执行扩展,但您可以使用string (REPLACE ...)
将列表扩展为以空格分隔的字符串:
string (REPLACE ";" " " LD_FLAGS_STR "${LD_FLAGS}")
set_target_properties(
myTarget PROPERTIES
LINK_FLAGS "${LD_FLAGS_STR}"
)
答案 1 :(得分:6)
要将cmake List用作列表,请使用
${LD_FLAG}
如果将cmake列表用作字符串,(列表项目用';')分隔,请使用
"${LD_FLAG}"
所以在你的情况下,只需删除""应该足够了。
答案 2 :(得分:5)
set_property
命令是为此
http://www.cmake.org/cmake/help/v3.0/command/set_property.html
set_property(TARGET tgt PROPERTY LINK_FLAGS foo bar)
答案 3 :(得分:1)
我像字符串一样使用它
set(FLAGS " f1 f2 f3")
注意前面的空格,它允许你连接其他标志集。
对于更复杂的项目,而不是if-elses,你也可以做双扩展技巧:
set(GCC_FLAGS " -Wl,--relax")
set(DIAB_FLAGS " -tPPCE500ES:cross")
set(MSVC_FLAGS " /RAINBOW_CRAP)
# ...
# ...LINUX_FLAGS, WINDOWS_FLAGS, etc...
set_target_properties(
myTarget PROPERTIES
LINK_FLAGS "${${COMPILER}_FLAGS} ${${SYSTEM}_FLAGS}"
)
# COMPILER and SYSTEM is set somewhere else, in toolchain files for example
答案 4 :(得分:0)
在cmake 3.x中,有几种方法
顶层CMakeLists.txt文件如下所示:
# The name of the included file could be anything,
# it doesn't have to be called CMakeLists.txt
include(foo/CMakeLists.txt)
include(bar/CMakeLists.txt)
add_executable(myApp ${myApp_SOURCES})
子目录文件的结构如下:
list(APPEND myApp_SOURCES
${CMAKE_CURRENT_LIST_DIR}/foo.cpp
${CMAKE_CURRENT_LIST_DIR}/foo_p.cpp
)