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

简介: 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

目录
相关文章
|
传感器 调度 开发者
【Freertos基础入门】freertos任务的优先级
【Freertos基础入门】freertos任务的优先级
2306 0
|
自然语言处理 安全 C++
【C++ 格式化输出 】C++20 现代C++格式化:拥抱std--format简化你的代码
【C++ 格式化输出 】C++20 现代C++格式化:拥抱std--format简化你的代码
10986 4
|
算法 安全 网络安全
简单认识一下mbedTLS
简单认识一下mbedTLS
3294 0
|
Ubuntu Linux Python
Linux(15)Ubuntu安装ninja构建工具
Linux(15)Ubuntu安装ninja构建工具
4620 0
CMake的拷贝文件到指定目录——CMake三板斧
CMake的拷贝文件到指定目录——CMake三板斧
2295 0
|
存储 Shell iOS开发
CMake中文手册_target_link_libraries(3.26)
CMake中文手册_target_link_libraries(3.26)
2054 0
|
存储
Qt使用 QSetting 对 ini 配置文件进行操作
Qt使用 QSetting 对 ini 配置文件进行操作
1782 0
qml import 自定义模块 cmake
qml import 自定义模块 cmake
1245 1
|
人工智能 IDE 程序员
GitHub Copilot 免费了!程序员们的福音来了!
《GitHub Copilot 免费了!程序员们的福音来了!》 近日,GitHub 宣布其 AI 编程助手 GitHub Copilot 现在可以免费使用。曾经每月需支付 10 美元订阅费的 Copilot,现在向所有人开放免费版本,这对个人开发者、初学者和小型团队来说是个大好消息。免费版支持 GPT 和 Claude 模型,并提供每月 2000 次代码补全和 50 条聊天消息等核心功能。用户只需注册或登录 GitHub 账户,在 VS Code 中安装扩展并激活免费版即可使用。此外,Visual Studio Code 也完全免费,进一步降低了开发门槛。 除了
13513 7
GitHub Copilot 免费了!程序员们的福音来了!
Cmake生成指定vs版本的工程文件
本文简单总结了使用 cmake 生成 visual studio 工程文件的过程