cmake debug 模式_cmake 管理debug release

CMake 管理项目的release 和debug

一个c/c++库,在编译的时候,可以选择编译是否带调试信息,带调试信息的就是Debug版,不带调试信息的就是Release版。 在CMakeLists.txt里一般不会制定当前工程是否是Debug还是Release, 这个信息可以通过CMake的命令参数传输进去,使用方法如下:

cmake .. -DCMAKE_BUILD_TYPE=Debug
cmake .. -DCMAKE_BUILD_TYPE=Release

其实我们在Visual Studio的配置管理那里,可以看到工程的设置不仅仅是这两个选项,而是有四个选项。

1. Debug

2. MinSizeRel

3. RelWithDebInfo

4. Release

806827af546041eca171ae1175b8e9c7.png

常用的一般来说就只有DebugRelease。 当然,我们也可以在CMakeLists.txt里手动指定CMAKE_BUILD_TYPE, 下面的就是mongo c driver里的一段代码:

if (NOT CMAKE_BUILD_TYPE)
   set (CMAKE_BUILD_TYPE "RelWithDebInfo")
   message (
      STATUS "No CMAKE_BUILD_TYPE selected, defaulting to ${CMAKE_BUILD_TYPE}"
   )
endif ()

一般来说这样设置就好了,但是在尝试使用mongo-cxx-driver的时候,发现一个很小的样例程序都会导致崩溃,最后的最简代码就如下两行:

std::string temp_str = bsoncxx::oid().to_string();
std::string temp_str2 = temp_str + "_" + temp_str;

执行到最下面一行就直接崩溃,一路跟踪to_string,发现这个函数最后会调用到mongo-c-driver那个dll里,看了一会代码发现我自己的测试工程是Release的,而依赖的两个dllDebug的。于是重新用cmake生成两个mongo相关的工程,加入参数-DCMAKE_BUILD_TYPE。重新来一遍,然而又崩了。切换到Debug模式准备单步调试,发现结果又是对的。只能继续怀疑原来的两个mongo项目,打开Visual Studio发现,两个项目居然还都是Debug的, Cmake传进来的工程类型不起作用。手动在配置管理器里切换这两个工程为Release,重新编译一下,再运行测试项目,完美。 看来在命令行里传递CMAKE_BUILD_TYPE有问题,于是去stackoverflow上搜,发现Windows上这个参数还真的不起作用。WTF!

Cmake的项目生成器总的来说可以分为两种:

1. single configuration 包括Unix Makefile , NMake Makefile, MinGw Makefile

2. multi configuration 包括Visual StudioXcode, 看上去带IDE的都属于这个类别

CMAKE_BUILD_TYPE只能指定single configuration类型的项目配置, 无法指定multi configuration的项目配置。multi configuration的项目配置是在使用者手动指定的时候修改的,默认都是Debug。 但是对于multi configuration的项目,我们可以在触发编译的时候指定是Debug还是Release:

cmake --build ./  --target install --config Release
cmake --build ./  --target install --config Debug

所以为了确保在跨平台的时候万无一失,最好在构建项目的时候传入CMAKE_BUILD_TYPE然后build的时候传入对tying的--config

但是这样搞,需要在两个地方传入参数,我们还有一个只修改一个地方的方式,修改CMAKE_CONFIGURATION_TYPES:

# Somewhere in CMakeLists.txt
message("Generated with config types: ${CMAKE_CONFIGURATION_TYPES}")
Default output:
-- Detecting CXX compiler ABI info - done
Generated with config types: Debug;Release;MinSizeRel;RelWithDebInfo
-- Configuring done

这个变量存储的是最终的项目的可选配置列表,我们可以通过手动指定来处理Debug|Release的问题。

cmake -H.  -DCMAKE_CONFIGURATION_TYPES="Debug;Release" 
-- Detecting CXX compiler ABI info - done
Generated with config types: Debug;Release

一般的项目里面,都没有做这些Debug Release的区分,生成的lib|dll|exe文件名都是一样的,这对我们在使用相应的库的时候会带来一些困扰。我们可以通过给对应配置的文件加后缀来区分,

set(CMAKE_DEBUG_POSTFIX "_d") 
set(CMAKE_RELEASE_POSTFIX "_r") 
set_target_properties(${TARGET_NAME} PROPERTIES DEBUG_POSTFIX "_d") 
set_target_properties(${TARGET_NAME} PROPERTIES RELEASE_POSTFIX "_r") 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值