编译器标志的cmake list append产生虚假结果? 我需要在我的CGEAR文件(CMAD2.2.102)中添加C和C++编译线的各种标志。我看到一些人使用添加定义,但从我所看到的情况来看,这是用于预处理器标志(-D)。我有一些不想传递给预处理器的标志

编译器标志的cmake list append产生虚假结果? 我需要在我的CGEAR文件(CMAD2.2.102)中添加C和C++编译线的各种标志。我看到一些人使用添加定义,但从我所看到的情况来看,这是用于预处理器标志(-D)。我有一些不想传递给预处理器的标志,cmake,Cmake,所以我一直在尝试修改CMAKE\u C\u标志和CMAKE\u CXX\u标志。我看到有些人在使用这样的东西: set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -new -flags -here") 但后来我在cmake文档中读到,这样做效率较低,正确的方法是使用list(APPEND…,如下所示: list(APPEND CMAKE_C_FLAGS -new -flags -here) 但是,当我这样做时,我的编译行包含用分号分隔的标志,这是一个语法错误。我读到这是

所以我一直在尝试修改
CMAKE\u C\u标志
CMAKE\u CXX\u标志
。我看到有些人在使用这样的东西:

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -new -flags -here")
但后来我在cmake文档中读到,这样做效率较低,正确的方法是使用
list(APPEND…
,如下所示:

list(APPEND CMAKE_C_FLAGS -new -flags -here)

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

在这种情况下,您确实会使用
集(CMAKE_C_FLAGS“${CMAKE_C_FLAGS}-new-FLAGS-here”)
技术

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

如果您确实想将标志列表保留为CMake列表,您可以这样做,但在退出CMakeLists.txt之前,您可以自己将列表“翻译”为单个字符串值
CMake___标志
,但这种情况很少见。

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

set(FOO "a")
list(APPEND FOO "b") # now FOO="a;b"
list(APPEND FOO "c") # now FOO="a;b;c"
set(FOO "a")
string(APPEND FOO " b") # now FOO="a b"
string(APPEND FOO " c") # now FOO="a b c"
set(FOO "a")
set(FOO "${FOO} b")
set(FOO "${FOO} c")
在CMake中,由空格分隔的项目组成的字符串只是一个字符串,而不是一个列表。使用
string(APPEND)
命令对其进行追加。例如:

set(FOO "a")
list(APPEND FOO "b") # now FOO="a;b"
list(APPEND FOO "c") # now FOO="a;b;c"
set(FOO "a")
string(APPEND FOO " b") # now FOO="a b"
string(APPEND FOO " c") # now FOO="a b c"
set(FOO "a")
set(FOO "${FOO} b")
set(FOO "${FOO} c")
在缺少
string(APPEND)
命令的旧版本CMake上,您应该回退到
set
命令。例如:

set(FOO "a")
list(APPEND FOO "b") # now FOO="a;b"
list(APPEND FOO "c") # now FOO="a;b;c"
set(FOO "a")
string(APPEND FOO " b") # now FOO="a b"
string(APPEND FOO " c") # now FOO="a b c"
set(FOO "a")
set(FOO "${FOO} b")
set(FOO "${FOO} c")

我在set()方法中使用了一个宏,因为在复制东西时很容易在变量名中出现不匹配的情况,等等:macro(append name item)set(${name}“${{name}}}${item}”)endmacro()一个更简洁的习惯用法是“string”(append CMAKE_C_FLAGS”-new FLAGS)。