首页 > 其他分享 >CMake 如何设置 Debug 和 Release 下的不同配置

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

时间:2024-05-20 10:57:03浏览次数:27  
标签:CODE CMake 编译 Debug BUILD Release TYPE

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

 

标签:CODE,CMake,编译,Debug,BUILD,Release,TYPE
From: https://www.cnblogs.com/lidabo/p/18201436

相关文章

  • cmake以源码的方式引入第三方项目
    最前#本文将介绍一种以源码的方式引入第三方库的方法准备#主项目,需要引用第三方库的某些函数第三方库,以源码的形式提供给主项目使用注意:本文的背景:已经将第三方源码下载好。一个例子#我这里准备一个简单的项目,调用第三方库 fmt;其中fmt是以源码的形式引入项目cmake......
  • 在CMakeLists.txt中添加源文件的几种方法
    单个.cpp源文件的情况用这段代码进行测试,CMake中添加一个可执行文件作为构建目标:#include<cstdio>intmain(){printf("Hello,world!\n");}指定源文件的时候可以有两种方式。在创建目标的时候直接指定源文件add_executable(mainmain.cpp)先创建目标,再添加源......
  • cmake配置项目引用动态库
    note#本文将介绍使用FIND_PACKAGE配置项目动态库的方法cmakeversion:3.18platform:win1020H2概述#创建了一个动态库,再由主项目调用该动态库。find<lib库名>.cmake的内容是:1.定义动态库的头文件所在路径2.定义库所在路径写好cmake文件后,也可以方便给其他人调用,省......
  • stm32cubemx+cmake vscode开发
    stm32cubemx在2.17之后可以新建cmake工程文件,然后就可以在vscode中无痛编译单片机程序,可以再配合openocd等编译调试下载1.准备1.1stm32cubemx1.2vscode1.3arm-none-eabi-gcc2.cubemx生成cmake工程文件2.1利用__weak函数实现cubemx代码与用户代码分离2.2利用宏定义......
  • 解决VSCode中Debug和运行路径不一致的
    哈喽,大家好,我是木头左!背景介绍在VisualStudioCode(简称VSCode)中进行开发时,经常需要使用到调试(Debug)功能。然而,有时候会发现,当尝试调试程序时,程序的运行路径与预期不符。这通常会导致程序无法正确读取文件或访问资源,从而影响调试过程。为了解决这个问题,可以在launch.json文件......
  • ./configure --with-debug --prefix=/Users/root/opt/nginx/debug_nginx
    %./configure--with-debug--prefix=/Users/root/opt/nginx/debug_nginxcheckingforOS+Darwin21.6.0x86_64checkingforCcompiler...found+usingClangCcompiler+clangversion:14.0.0(clang-1400.0.29.202)checkingfor-Wl,-Eswitch...notfoundchec......
  • jenkins docker 开启debug 简单说明
    jenkinsdocker镜像为了方便调试,已经内置了一个环境变量可以方便的开启基于jdwp协议的debug处理,以下是一个简单使用参考配置docker-compose文件services:jenkins:image:jenkins/jenkins:ltsenvironment:-DEBUG=trueports:......
  • CMake Tutorial
    step1theminalprojectcmake_minimum_required(VERSION3.10)project(Tutorial)add_executable(Tutorialtutorial.cxx)specifyingc++standardset(CMAKE_CXX_STANDARD11)set(CMAKE_CXX_STANDARD_REQUIREDTrue)projectversionproject(TutorialVERSION1.0)......
  • CMake Professtional-2 Variables
    set(varNamevalue...[PARENT_SCOPE])cmake中所有的值都是string,如果同时添加多个值,会自动添加;set(myVarabc)#myVar="a;b;c"set(myVara;b;c)#myVar="a;b;c"set(myVar"abc")#myVar="abc"set(myVarab;c)#myVar=&q......
  • CMake Professtional-1 Introduction
    thestageofcmakeGeneratingProjectFileschooseaprojectgenerator:Ninja,UnixMakefiles,MSYSMakefilesmkdirbuildcdbuildcmake-G"UnixMakefiles"../source#use--helpcandisplaythevariablecmake-G-hbuildingtoolcmake--bui......