簡體   English   中英

如何使用 CMake 通過命令行定義 C++ 預處理器宏?

[英]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 使用CFLAGSCXX_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM