[英]How to define a C++ preprocessor macro through the command line with CMake?
我嘗試在 CMake 的命令行中設置預處理器宏。 我試過了:
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
我該怎么做?
一個不錯的選擇是定義一個 cmake 選項:
OPTION(DEFINE_MACRO "Option description" ON) # Enabled by default
后跟一個條件:
IF(DEFINE_MACRO)
ADD_DEFINITIONS(-DMACRO)
ENDIF(DEFINE_MACRO)
然后,您可以使用-D
標志通過命令行和 cmake 打開/關閉該選項。 例子:
cmake -DDEFINE_MACRO=OFF ..
為了確保編譯器正確接收定義,您可以在詳細模式下調用 make 並檢查是否定義了宏:
make VERBOSE=1
這也是一個很好的解決方案,因為當任何 cmake 選項更改時, make
將重新編譯您的代碼。
試試這個-D CMAKE_CXX_FLAGS=/DMY_MACRO=1
問題背后的動機是批量構建 3rd 方庫,這就是為什么我想避免修改 CMakeLists.txt 的原因。 多年后,即使我不再需要它,我發現它很容易通過CMake 外部的方式實現:
像往常一樣調用 CMake,沒有特殊標志。
然后:
使用 MSVC:編譯器讀取CL
環境變量以獲取額外的命令行參數。 所以
set CL=/DMY_MACRO=1 %CL%
然后調用 MSBuild 來完成它的工作。
使用 Makefile:生成的 makefile 使用CFLAGS
和CXX_FLAGS
變量作為 makefile 的預期用途。 所以構建可以通過
make CXX_FLAGS=-DMY_MACRO=1
或者通過設置相應的環境變量。
除非您有充分的理由不這樣做,否則您應該使用ADD_DEFINITIONS(<name>=<value>[, ...])
。
只需將以下行添加到您的 CMakeLists.txt:
ADD_DEFINITIONS("MY_MACRO=1")
CMake 將處理開關的語法(無論是-D<name>=<value>
還是/D<name>=<value>
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.