cmake list append for compiler flags会产生伪造的结果?

时间:2013-05-08 05:37:22

标签: cmake

我需要在我的CMake文件(CMake 2.8.10.2)中为我的C和C ++编译行添加各种标志。我看到有些人使用add_definitions但我可以看到它用于预处理程序标志(-D)。我有一些我不想传递给预处理器的标志。

所以我一直在尝试修改CMAKE_C_FLAGSCMAKE_CXX_FLAGS。我看到有些人正在使用类似的东西:

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -new -flags -here")

然后我在cmake文档中读到这样效率较低,而正确的方法是使用list(APPEND ...),如下所示:

list(APPEND CMAKE_C_FLAGS -new -flags -here)

但是,当我这样做时,我的编译行包含由分号分隔的标志,并且是语法错误。我读到这是现在列表存储在内部,但我认为这将由cmake在我使用变量时处理。这看起来很基本;难道我做错了什么?我的意思是,如果这些列表不能被使用,除非你碰巧想要一个以分号分隔的值列表(除了我想要的Windows%PATH%设置或其他东西)之外,这些列表的好处是什么?我是否应该使用引用的版本,即使文档表明它的效率/适当效率较低?

2 个答案:

答案 0 :(得分:7)

在这种情况下,您通常会使用set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -new -flags -here")技术。

你在大多数其他环境中都是对的.CMake可以将分号分隔列表“转换”为编译器有意义的内容(例如可执行文件中的源文件列表),但在这种情况下,CMake采用flags作为传递给编译器/链接器的单个完整字符串。

如果您真的希望将标记列表保留为CMake列表,但是在退出CMakeLists.txt之前,您可以自己将列表“转换”为单个字符串值CMAKE_C_FLAGS,但它是看到这个很不寻常。

答案 1 :(得分:4)

在CMake中,"列表"是由分号分隔的一系列项目。例如:

set(FOO "a")
list(APPEND FOO "b") # now FOO="a;b"
list(APPEND FOO "c") # now FOO="a;b;c"

在CMake中,一串空格 - 分隔的项目只是一个字符串,而不是一个列表。使用string(APPEND)命令附加到它。例如:

set(FOO "a")
string(APPEND FOO " b") # now FOO="a b"
string(APPEND FOO " c") # now FOO="a b c"

在缺少string(APPEND)命令的旧版本的CMake上,您应该回退到set命令。例如:

set(FOO "a")
set(FOO "${FOO} b")
set(FOO "${FOO} c")