附加到CMAKE_C_FLAGS

时间:2015-04-27 16:35:44

标签: c++ c cmake compiler-flags linker-flags

我使用CMake进行两个版本的项目,其中一个需要-lglapi而另一个不需要.lglapi。

到目前为止,我们使用的线条看起来像这样:

SET(CMAKE_C_FLAGS "-O3 -xSSE3 -restrict -lpthread -lX11 -ldrm")
SET(CMAKE_CXX_FLAGS "-O3 -xSSE3 -restrict -lpthread -lX11 -ldrm")

我在我的CMakeList.txt中添加了一个if语句,紧跟在这些行之后:

if(SINGLE_MODE)
    SET(CMAKE_C_FLAGS ${CMAKE_C_FLAGS} " -lglapi")
    SET(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} " -lglapi")
endif(SINGLE_MODE)

SINGLE_MODE变量定义略高。当我使用message命令显示标志变量的内容时,它看起来没问题:

-O3 -xSSE3 -restrict -lpthread -lX11 -ldrm -lglapi

但是当我开始编译时,我遇到了编译错误。使用详细模式我意识到在编译器调用中它看起来像:

-O3 -xSSE3 -restrict -lpthread -lX11 -ldrm; -lglapi

即。不知怎的,在将-lglapi添加到列表之前添加了分号。

这里有没有人遇到过类似的问题并知道解决此问题的方法?我已经搜索了很长一段时间并研究了CMake手册但是我看不出我在这里做错了什么。

谢谢, 托拜厄斯

3 个答案:

答案 0 :(得分:19)

尝试改为:

if(SINGLE_MODE)
    SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -lglapi")
    SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lglapi")
endif(SINGLE_MODE)

然后,您确定将-lglapi追加到现有的${CMAKE_CXX_FLAGS}字符串中。否则,看起来像正在创建一个CMake列表。

答案 1 :(得分:5)

CMake 3.4以来:

string(APPEND CMAKE_CXX_FLAGS " -lglapi")

当你只想为一种语言设置标志时(上例中的C ++),这非常方便,但是如果你想为所有语言设置相同的标志,你可以这样做:

add_compile_options(-lglapi)

两个命令都会更改整个目录的标志,如果只想设置一个目标的标志,请执行以下操作:

target_compile_options(my_lib PUBLIC -lglapi)

目标上的标志可以是PUBLIC, PRIVATE or INTERFACE,允许将标志从一个目标传递到另一个目标。

答案 2 :(得分:0)

仅在要添加编译器和链接器选项的特殊情况下(例如--coverage选项),以下语法将标志添加到链接器和编译器:

SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --coverage")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --coverage")

(以上命令将--coverage选项添加到C和C ++的编译器和标志选项中)

否则,如果您更喜欢使用新的CMake命令(add_compile_options和add_link_options),请不要忘记也添加到链接器选项:

add_compile_options(--coverage)
add_link_options(--coverage)

(以上命令将--coverage选项添加到C和C ++的编译器和标志选项中)