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

Mad*_*ist 9 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")
Run Code Online (Sandbox Code Playgroud)

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

list(APPEND CMAKE_C_FLAGS -new -flags -here)
Run Code Online (Sandbox Code Playgroud)

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

Fra*_*ser 8

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

你在大多数其他情况下都是正确的.CMake可以将分号分隔列表"转换"为编译器有意义的东西(例如可执行文件中的源文件列表),但在这种情况下,CMake将标记作为要传递给编译器/链接器的单个完整字符串.

如果你真的希望将标志列表保存为CMake列表,那么你可以在退出CMakeLists.txt之前将自己"转换"为单个字符串值CMAKE_C_FLAGS,但看到这一点并不常见.

  • 更简洁的习惯用法是`string(APPEND CMAKE_C_FLAGS“ -new-flags”)。 (2认同)

Cha*_*ary 6

在CMake中,“列表”是一串用分号分隔的项目。例如:

set(FOO "a")
list(APPEND FOO "b") # now FOO="a;b"
list(APPEND FOO "c") # now FOO="a;b;c"
Run Code Online (Sandbox Code Playgroud)

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

set(FOO "a")
string(APPEND FOO " b") # now FOO="a b"
string(APPEND FOO " c") # now FOO="a b c"
Run Code Online (Sandbox Code Playgroud)

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

set(FOO "a")
set(FOO "${FOO} b")
set(FOO "${FOO} c")
Run Code Online (Sandbox Code Playgroud)