CMake 設置 Debug 和 Release 的不同配置
I - 原因
由於 Debug 和 Release 下工程的依賴庫不同,另外,方便定義不同的宏來隔離調試和發佈的代碼,如不希望在發佈時打印調試信息影響性能等。
示例代碼
#ifdef DEV_CODE
#define LOG(msg) std::cout <<"["<< __FILE__<<"]:" <<__func__<<__LINE__ << msg << std::endl
#else
#define LOG(msg)
#endif
//...
bool Console::CallMethod(const std::string & param)
{
//...
if (error)
{
LOG("error message");
return false;
}
}
則 “error message” 只會在宏 DEV_CODE
被定義的情況下才會被打印
注:__FUNCTION__ 與 __func__ 的不同之處爲,前者會帶有類名,上述代碼,前者內容爲 Console::CallMethod ,後者只有 CallMethod
II - 如何設置
2.1 - 配置不同的庫
Windows 平臺開發,通常會需要依賴 VC 的運行庫,而 Debug 和 Release 兩種編譯類型下的依賴庫名稱不同,Release 類型的依賴庫通常會少一個字符 d, 如:msvcrtd.lib
和 msvcrt.lib
。
在這種情況下,就可以通過 CMake 的兩個關鍵字 debug
和 optimized
來區分配置,在 Debug 編譯時鏈接庫 msvcrtd.lib
,在 Release 編譯時鏈接庫 msvcrt.lib
。
示例:
set(target_name Demo)
# 區分 debug 和 release 下不同的鏈接庫
target_link_libraries(${target_name} PUBLIC
debug msvcrtd.lib
optimized msvcrt.lib)
2.2 - 配置不同的宏
CMake 設置宏定義可使用 target_compile_definitions
或者 add_definitions
指令。
區分 Debug 還是 Release 可通過判斷變量 CMAKE_BUILD_TYPE
,此變量可設置爲四種不同的值:
- Debug
- Release
- MinSizeRel
- RelWithDebInfo (使用 Release 編譯並且可以使用調試器)
注: Release 編譯有很多等級,如 O1, O2, O3, O3 爲最高,O表示 optimization 優化。
此外,每個 Release 編譯都會定義宏 NDEBUG,Debug 編譯一般會定義 DEBUG 宏爲 1。
如何定義?
需要執行 cmake 命令時添加 -DCMAKE_BUILD_TYPE:STRING=Debug
cmake .. -DCMAKE_BUILD_TYPE:STRING=Debug
cmake .. -DCMAKE_BUILD_TYPE:STRING=Release
或者在 CMakeLists.txt 中定義
set(CMAKE_BUILD_TYPE "Debug")
# 或
set(CMAKE_BUILD_TYPE "Release")
如何判斷?
使用判斷指令 :STREQUAL
#判斷
if (${CMAKE_BUILD_TYPE} STREQUAL "Debug")
# Debug 配置
elseif (${CMAKE_BUILD_TYPE} STREQUAL "Release")
# Release 配置
else ()
# 其他配置
endif ()
所以綜上所述,爲了實現自定義的 DEV_CODE
定義,CMakeLists.txt 的寫法如下
if (${CMAKE_BUILD_TYPE} STREQUAL "Debug")
target_compile_definitions(${proj_name} PRIVATE DEV_CODE=1)
else ()
# -UDEV_CODE 表示取消 DEV_CODE 的定義
add_definitions(-UDEV_CODE)
endif ()
此部分 CMakeLists.txt 表示在判斷編譯類型,在 Debug 編譯時定義宏 DEV_CODE
並設置值爲 1 ,若不爲 Debug 編譯,或者說 Release 編譯時,則取消 DEV_CODE
的定義。
注:不要忽略 else 和 endif 之後的括號,否則會產生 CMake 語法錯誤。
也可以使用以下語句表示定義宏
add_definitions(-DDEV_CODE=1)
-D
表示 define 定義,-U
表示 undefine 撤銷定義