16

我需要在我的 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% 设置或其他东西),否则如果无法使用这些列表,那么这些列表到底有什么用?即使文档表明它的效率/适当性较低,我是否应该使用引用的版本?

4

2 回答 2

19

在 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")
于 2017-03-14T15:53:20.283 回答
8

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

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

如果您真的想将标志列表保留为 CMake 列表,则可以,但在退出 CMakeLists.txt 之前,您可以自己将列表“翻译”为单个字符串值CMAKE_C_FLAGS,但看到这种情况并不常见。

于 2013-05-08T07:18:28.823 回答