2015-04-27 56 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,允許將標誌從一個目標傳遞到另一個目標。