簡體   English   中英

通過 CMake 定義預處理器宏?

[英]Define preprocessor macro through CMake?

如何通過 CMake 定義預處理器變量?

等效的代碼是#define foo

很長一段時間以來,CMake 都有用於此目的的add_definitions命令。 但是,最近該命令已被更細粒度的方法(用於編譯定義、包括目錄和編譯器選項的單獨命令)取代。

使用新add_compile_definitions的示例:

add_compile_definitions(OPENCV_VERSION=${OpenCV_VERSION})
add_compile_definitions(WITH_OPENCV2)

或者:

add_compile_definitions(OPENCV_VERSION=${OpenCV_VERSION} WITH_OPENCV2)

這樣做的好處是它規避了 CMake 為add_definitions的破舊詭計。 CMake 是一個如此破舊的系統,但他們終於找到了一些理智。

在此處找到有關用於編譯器標志的命令的更多說明: https : //cmake.org/cmake/help/latest/command/add_definitions.html

同樣,您可以按照 Jim Hunziker 的回答中的說明按目標執行此操作。

要針對特定​​目標執行此操作,您可以執行以下操作:

target_compile_definitions(my_target PRIVATE FOO=1 BAR=1)

如果您要構建的目標不止一個,並且您不希望它們都使用相同的標志,則應該這樣做。 另請參閱有關target_compile_definitions的官方文檔。

此頁面上提出的其他解決方案對於Cmake < 3.3.2某些版本很有用。 這是我正在使用的版本的解決方案(即3.3.2 )。 使用$ cmake --version檢查 Cmake 的$ cmake --version並選擇適合您需求的解決方案。 可以在官方頁面上找到cmake 文檔

使用 CMake 3.3.2 版本,為了創建

#define foo

我需要使用:

add_definitions(-Dfoo)   # <--------HERE THE NEW CMAKE LINE inside CMakeLists.txt
add_executable( ....)
target_link_libraries(....)

並且,為了有一個像另一個這樣的預處理器宏定義:

#define foo=5

該行如此修改:

add_definitions(-Dfoo=5)   # <--------HERE THE NEW CMAKE LINE inside CMakeLists.txt
add_executable( ....)
target_link_libraries(....)

當您的解決方案包含許多項目時,我建議使用target_***操作而不是add_***操作。

這是一個示例,您可以在其中將值從 CMAKE 傳遞到 C++ 代碼。 說,你想通過:

  • 標志,在這里:BOOST(“真”或“假”)
  • 軟件版本字符串(例如:“1.0.0”)

我建議將它們作為字符串傳遞。 因此,當您使用 CMAKE 構建軟件時,您可以傳遞參數,例如,如果它是使用 boost 庫構建的,從 CMAKE 變量中提取的軟件版本(這樣您只能在一個地方更改該數字)見下文。

在 CMakeLists.txt 中:

add_compile_definitions( BOOST="${BOOST}" Software_VERSION="${PROJECT_VERSION}" )

在您的 .cpp 代碼中:

std::cout << "軟件版本是:" << Software_VERSION << " BOOST:" << BOOST << "\\n";

希望這可以幫助。 問候。

1.) target_compile_definitions

如果您使用 CMake 3.X,添加預處理器宏的首選應該是target_compile_definitions

您應該更喜歡這種方法而不是任何其他方法的原因是因為它的粒度是基於target的。 IE 宏只會添加到您的 exe/庫中。

下面是一個常見的例子:

if (WIN32)
    target_compile_definitions(my_lib PRIVATE   
       # Prevents Windows.h from adding unnecessary includes    
       WIN32_LEAN_AND_MEAN  
       # Prevents Windows.h from defining min/max as macros 
       NOMINMAX 
    )   
endif() 

2.) add_compile_definitions

3.12 版中的新功能。

在此處找到有關用於編譯器標志的命令的更多說明: https : //cmake.org/cmake/help/latest/command/add_definitions.html

add_compile_definitions將宏應用於調用后定義的任何目標。

這是與 add_compile_definitions 相同的邏輯。

add_compile_definitions(WIN32_LEAN_AND_MEAN NOMINMAX)
add_library(my_lib)

如果您使用這種方法,如果您是頂級項目,請小心。 否則,如果用戶使用add_subdirectory使用您的庫,他們可能會遇到問題。

3.) 其他不太推薦的方式

這些方法真的不再推薦了。 由於不是模塊化的,不能很好地擴展,不支持生成器表達式等。

為什么 target_compile_definitions 更好/更受歡迎?

  • 您的 CMake 代碼的讀者更清楚它是如何工作的。
  • 如果需要,允許使用 PRIVATE/PUBLIC/INTERFACE。 這可以讓您圖書館的消費者的生活更輕松。
  • 它更加模塊化。

全局應用預處理器標志(或任何編譯器標志)可以在您的構建中創建隱藏的依賴項。

本質上將 add_compile_definitions 視為 C/C++ 中的全局變量。 有時您需要它們,但要小心。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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