2011-12-19 118 views
20

我嘗試在CMake的命令行中設置一個預處理器宏。我已經試過:如何使用CMake通過命令行定義C++預處理器宏?

set generator="Visual Studio 8 2005" 
set params=-D MY_MACRO=1 
cmake.exe -G %generator% %params% ..\some_project 

但是當我編譯它既不確定也不是我可以通過CMake的生成的所有文件查找名稱MY_MACRO,除了CMakeCache.txt它是存在於窗體:

MY_MACRO:UNINITIALIZED=1 

我該怎麼辦?

+1

如果你現在解決了這個問題,我會對解決方案感興趣 – 2012-03-02 10:03:03

+1

@TimMeyer:不。顯然這是不可能的。 – ybungalobill 2012-03-02 14:25:45

+0

@ybungalobill: 您不能從命令行注入宏,您只能修改CMakeLists.txt中定義的現有宏。 另外,* set params = -D MY_MACRO = 1 *應該是* set params = -DMY_MACRO = 1 * – NeoH4x0r 2018-01-08 08:57:21

回答

6

試試這個:-D CMAKE_CXX_FLAGS=/DMY_MACRO=1

+3

它確實有一半是可行的。它會覆蓋'CMAKE_CXX_FLAGS'的值。我試過'-D CMAKE_CXX_FLAGS =「/ DMY_MACRO = 1 $ {CMAKE_CXX_FLAGS}」',但'$ {CMAKE_CXX_FLAGS}'沒有得到擴展。任何人都知道如何解決此問題? – ybungalobill 2011-12-19 16:58:57

+0

命令行中的雙引號字符串將由bash擴展。由於您沒有名爲CMAKE_CXX_FLAGS的環境變量,因此bash在cmake甚至看到它之前將其展開爲「」。改用單引號。 – Tolli 2015-07-27 15:36:28

+0

@Tolli似乎也不工作。它防止bash擴展變量,但cmake不擴展它。它將字面值'/ DMY_MACRO = 1 $ {CMAKE_CXX_FLAGS}'直接傳遞給編譯器。 – pavon 2016-03-16 18:12:51

-5

除非你有一個很好的理由,你應該使用ADD_DEFINITIONS(<name>=<value>[, ...])

只是將下面的行添加到您的CMakeLists.txt:

ADD_DEFINITIONS("MY_MACRO=1") 

CMake的將開關(無論是-D<name>=<value>,或/D<name>=<value>)的語法的照顧。

+13

修改CMakeLists.txt不算作命令行解決方案。是的,我有一個很好的理由不這樣做。我必須自動化構建過程,並且*不應該*更改來源。 – ybungalobill 2011-12-19 18:57:40

+0

對不起,關於空間;我想添加一個命令行解決方案,但它不是你想要的。儘管如此,從命令行開始只會讓你的一天變得悲慘,相信我。 – hiobs 2011-12-19 19:16:17

+0

有時,命令行比gui應用程序更有用,有時不會。我真的不認爲這會讓你的一天變得悲慘,因爲這取決於情況,用戶的技能和個人喜好。 – NeoH4x0r 2018-01-08 08:46:18

14

一個好的替代方法是定義一個cmake的選項:

OPTION(DEFINE_MACRO "Option description" ON) # Enabled by default 

隨之而來的是條件:

IF(DEFINE_MACRO) 
    ADD_DEFINITIONS(-DMACRO) 
ENDIF(DEFINE_MACRO) 

這樣就可以開啓該選項ON /經由命令行OFF用C進行-D標誌。例如:

cmake -DDEFINE_MACRO=OFF .. 

要確保編譯器接收的定義權,你可以打電話讓在詳細模式下,檢查宏被定義或沒有:

make VERBOSE=1 

這是一個很好的解決方案還因爲make將在任何cmake選項更改時重新編譯您的代碼。

+2

這需要修改CMakeLists,所以它不是解決方案(-1)。 – ybungalobill 2016-11-18 07:17:54