2015-04-27 54 views
10

我使用CMake为两个版本的项目,其中一个需要-lglapi,另一个不需要。追加到CMAKE_C_FLAGS

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

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

我添加了一个if语句在我CMakeList.txt这些线路正好经过:

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 

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

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

感谢, 托比亚斯

+4

你试过'SET(CMAKE_CXX_FLAGS“$ {CMAKE_CXX_FLAGS} -lglapi”)吗? – jpo38

+0

@ jpo38您应该回答并获得您的名誉:) – Antonio

+0

@ jpo38,谢谢。那就是诀窍。我应该自己想到这个,但在看了太久的东西之后,你有点失明了。 – TobiSF

回答

14

尝试这样做,而不是:

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

+0

这是非常样板。有一个更短的解决方案吗? – nowox

+0

@nowox:没有任何我知道的 – jpo38

+0

哦:(我不是真的知道CMake,但是不可能使用'list(APPEND'? – nowox

0

由于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,允许将标志从一个目标传递到另一个目标。