45

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 属性(或任何属性)时,它会扩展为多个参数,而不仅仅是一个?

谢谢,丹

4

6 回答 6

28

我不认为set_target_properties可以自动进行扩展,但您可以使用string (REPLACE ...)将列表扩展为空格分隔的字符串:

string (REPLACE ";" " " LD_FLAGS_STR "${LD_FLAGS}")
set_target_properties(
  myTarget PROPERTIES
  LINK_FLAGS  "${LD_FLAGS_STR}"
)
于 2012-07-21T20:02:19.070 回答
17

要使用 cmake List 作为列表,请使用

${LD_FLAG}

要使用 cmake 列表作为字符串(即列表项用 ';' 分隔),请使用

"${LD_FLAG}"

因此,在您的情况下,只需删除 "" 就足够了。

于 2014-08-05T02:50:51.503 回答
7

set_property命令是为此设计的

http://www.cmake.org/cmake/help/v3.0/command/set_property.html

set_property(TARGET tgt PROPERTY LINK_FLAGS foo bar)
于 2014-08-05T12:54:29.963 回答
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
于 2013-06-11T08:42:58.847 回答
0
separate_arguments(LD_FLAGS_AS_LIST  NATIVE_COMMAND  LD_FLAGS)

set_target_properties(
  myTarget PROPERTIES
  LINK_FLAGS  "${LD_FLAGS_AS_LIST}"
)
于 2021-09-29T00:33:46.707 回答
-1

在 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
)

使用 target_sources() 增强源文件处理

于 2019-02-23T16:26:45.580 回答