我需要在我的CMake文件(CMake 2.8.10.2)中为我的C和C ++编译行添加各种标志。我看到有些人使用add_definitions
但我可以看到它用于预处理程序标志(-D
)。我有一些我不想传递给预处理器的标志。
所以我一直在尝试修改CMAKE_C_FLAGS
和CMAKE_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%设置或其他东西)之外,这些列表的好处是什么?我是否应该使用引用的版本,即使文档表明它的效率/适当效率较低?
答案 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")