CMake 如何設置 Debug 和 Release 下的不同配置

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.libmsvcrt.lib

在這種情況下,就可以通過 CMake 的兩個關鍵字 debugoptimized 來區分配置,在 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 撤銷定義

參考鏈接:https://www.10sxj.com/post/27.html

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章