[英]How to define a C++ preprocessor macro through the command line with 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++ 代碼。 說,你想通過:
我建議將它們作為字符串傳遞。 因此,當您使用 CMAKE 構建軟件時,您可以傳遞參數,例如,如果它是使用 boost 庫構建的,從 CMAKE 變量中提取的軟件版本(這樣您只能在一個地方更改該數字)見下文。
在 CMakeLists.txt 中:
add_compile_definitions( BOOST="${BOOST}" Software_VERSION="${PROJECT_VERSION}" )
在您的 .cpp 代碼中:
std::cout << "軟件版本是:" << Software_VERSION << " BOOST:" << BOOST << "\\n";
希望這可以幫助。 問候。
如果您使用 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()
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使用您的庫,他們可能會遇到問題。
這些方法真的不再推薦了。 由於不是模塊化的,不能很好地擴展,不支持生成器表達式等。
全局應用預處理器標志(或任何編譯器標志)可以在您的構建中創建隱藏的依賴項。
本質上將 add_compile_definitions 視為 C/C++ 中的全局變量。 有時您需要它們,但要小心。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.