24

我正在将 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 变量被定义了一点。当我使用消息命令显示标志变量的内容时,它看起来没问题:

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

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

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

即,在将-lgapi 添加到列表之前,以某种方式添加了一个分号。

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

谢谢,托拜厄斯

4

3 回答 3

31

尝试这样做:

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 列表。

于 2015-04-27T16:49:06.303 回答
17

CMake 3.4开始,您可以:

string(APPEND CMAKE_CXX_FLAGS " -lglapi")

当您只想为一种语言(上例中的 C++)设置标志时,这非常方便,但如果您想为所有语言设置相同的标志,您可以简单地执行以下操作:

add_compile_options(-lglapi)

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

target_compile_options(my_lib PUBLIC -lglapi)

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

于 2018-01-05T13:16:25.960 回答
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++ 的编译器和标志选项)

于 2020-12-02T17:11:52.820 回答