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 撤销定义