将内容追加到CMAKE_C_FLAGS

25

我正在使用CMake进行一个项目的开发,这个项目有两个版本,其中一个需要-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手册,但无法找出我的错误所在。

谢谢, 托比亚斯


5
你尝试过使用 SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lglapi") 吗?这行代码用来设置C++编译器的标志,增加链接到OpenGL API库的选项。 - jpo38
@jpo38 你应该回答并获得你应得的声望 :) - Antonio
@jpo38,谢谢。这就解决了问题。本来应该自己想到的,但是看着东西太久了,有时候会变得盲目。 - TobiSF
谢谢。由于我当前的计算机上没有安装CMake,所以无法进行测试。在发布未经测试的答案之前,更希望得到您的反馈,以避免获得任何负面评价...;-)。现在准备好接受赞了! - jpo38
3个回答

34

尝试使用以下方法:

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
这很模板化。有更简短的解决方案吗? - nowox
@nowox:我不知道有任何这样的。 - jpo38
哦 :( 我不太了解CMake,但是使用list(APPEND)不可能吗? - nowox

19
自从CMake 3.4以后,你需要:

string(APPEND CMAKE_CXX_FLAGS " -lglapi")

如果你只想针对一个语言(C++在上面的例子中)设置标志,那么这非常实用;但是如果你想为所有语言设置相同的标志,你可以简单地执行以下操作:

add_compile_options(-lglapi)

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

target_compile_options(my_lib PUBLIC -lglapi)

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


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)

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接