2013-05-08 78 views
6

我需要爲我的CMake文件(CMake 2.8.10.2)中的C和C++編譯行添加各種標誌。我看到一些人使用add_definitions,但從我可以看到的是用於預處理器標誌(-D)。我有一些我不想傳遞給預處理器的標誌。cmake list爲編譯器標誌追加產生假結果?

所以我一直在嘗試修改CMAKE_C_FLAGSCMAKE_CXX_FLAGS。我看到一些人使用的東西,如:

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -new -flags -here") 

但後來我在cmake的文檔閱讀,這是效率較低,並做到這一點是使用list(APPEND ...),這樣的正確方法:

list(APPEND CMAKE_C_FLAGS -new -flags -here) 

但是,當我這樣做時,我的編譯行包含用分號分隔的標誌,並且是語法錯誤。我讀到,這是列表內部存儲,但我認爲這將由cmake照顧,當我使用該變量。這似乎很基礎;難道我做錯了什麼?我的意思是,如果不能使用這些列表,除非你碰巧想要一個以分號分隔的值列表(除了我猜想Windows%PATH%設置或其他東西),否則這些列表有什麼用處?我應該使用引用的版本,即使文檔顯示它效率較低/合適嗎?

+1

我使用了一個宏,雖然因爲它很容易複製的東西等時,得到的VAR名稱不匹配的集()方法: 宏(追加名項目) \t集($ {名稱}「$ {$ {name}} $ {item}」) endmacro() – Trass3r 2013-07-17 12:02:56

回答

6

在這種情況下,您確實通常會使用set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -new -flags -here")技術。你可以在大多數其他語境中正確使用CMake可以將分號分隔列表「翻譯」爲編譯器有意義的內容(例如可執行文件中的源文件列表),但在這種情況下,CMake需要這些標誌作爲一個完整的字符串傳遞給編譯器/鏈接器。

如果您真的想要將標誌列表保留爲CMake列表,但在退出CMakeLists.txt之前,您可以將列表「翻譯」爲單個字符串值CMAKE_C_FLAGS,但很難看到這個。

+1

一個更簡潔的成語是'string(APPEND CMAKE_C_FLAGS「-new-flags」)。 – Chadversary 2017-03-14 15:54:01

1

在CMake中,「列表」是由分號分隔的一串項目。例如:

set(FOO "a") 
list(APPEND FOO "b") # now FOO="a;b" 
list(APPEND FOO "c") # now FOO="a;b;c" 

在CMake的,的空間 -seperated項的字符串就是一個字符串,而不是一個列表。使用string(APPEND)命令附加到它。例如:

set(FOO "a") 
string(APPEND FOO " b") # now FOO="a b" 
string(APPEND FOO " c") # now FOO="a b c" 

在舊版本的CMake的是缺乏string(APPEND)命令,就應該退回到set命令。例如:

set(FOO "a") 
set(FOO "${FOO} b") 
set(FOO "${FOO} c")