CMakeLists.txt中没有使用CMAKE_BUILD_TYPE

我有麻烦设置我的默认生成configuration释放,在我的CMakeLists.txt文件我设置CMAKE_BUILD_TYPE在文件的顶部

#enable Release ALWAYS, configure vars set(CMAKE_BUILD_TYPE Release) set(EXECUTABLE_NAME "ParticleSimulator") set(VERSION_MAJOR 0) set(VERSION_MINOR 2) 

但是在构build我的项目并打开解决scheme时,我始终使用Debug模式,与我在CMakeLists文件中指定的模式相反。 我究竟做错了什么? 我已经看了一些其他的问题,但没有看到这个问题的具体内容。

CMakeLists.txt的要点

有两种types的发电机:单一configuration和多种configuration。

单一configuration

Make-like生成器: Unix Makefiles , NMake Makefiles , MinGW Makefiles ,…

在生成步骤中设置configurationtypes:

 cmake -H. -B_builds/Debug -DCMAKE_BUILD_TYPE=Debug "-GUnix Makefiles" 

在这种情况下,构build步骤总是debugging:

 > cmake --build _builds/Debug /usr/bin/c++ -g ... > cmake --build _builds/Debug --config Debug # `--config` ignored /usr/bin/c++ -g ... > cmake --build _builds/Debug --config Release # yep, ignored /usr/bin/c++ -g ... 

多configuration

IDE生成器: Visual Studio , Xcode

生成步骤中的CMAKE_BUILD_TYPE被忽略,两者:

 > cmake -H. -B_builds -DCMAKE_BUILD_TYPE=Debug "-GVisual Studio 12 2013 Win64" 

 > cmake -H. -B_builds -DCMAKE_BUILD_TYPE=Release "-GVisual Studio 12 2013 Win64" 

会有同样的效果:

在这里输入图像描述

这是因为所有的configuration都是内部的(即_builds/msvc-opaque/Release_builds/msvc-opaque/Debug或者什么都没有关系)。 你可以使用--config选项来切换:

 > cmake --build _builds --config Release cl /O2 ... > cmake --build _builds --config Debug cl /Od ... 

控制 (?)

是的你可以。 只需定义CMAKE_CONFIGURATION_TYPES :

 # Somewhere in CMakeLists.txt message("Generated with config types: ${CMAKE_CONFIGURATION_TYPES}") 

默认输出:

 -- Detecting CXX compiler ABI info - done Generated with config types: Debug;Release;MinSizeRel;RelWithDebInfo -- Configuring done 

重写它:

 > cmake -H. -B_builds -DCMAKE_CONFIGURATION_TYPES="Debug;Release" "-GVisual Studio 12 2013 Win64" -- Detecting CXX compiler ABI info - done Generated with config types: Debug;Release -- Configuring done 

在这里输入图像描述

你甚至可以定义你自己的configurationtypes:

 > cmake -H. -B_builds -DCMAKE_CONFIGURATION_TYPES="Debug;MyRelease" -DCMAKE_CXX_FLAGS_MYRELEASE="/My-Rel-flag" -DCMAKE_EXE_LINKER_FLAGS_MYRELEASE="/My-Linker-flags" "-GVisual Studio 12 2013 Win64" 

在这里输入图像描述

并build立:

cmake –build _builds –config MyRelease

乱 (?)

一点也不知道如果你知道这个技巧:)这是如何在脚本/ CI服务器/文档的构build指令等中build立/testingconfiguration:

 > CONFIG=Debug > cmake -H. -B_builds "-DCMAKE_BUILD_TYPE=${CONFIG}" # Set Debug to Makefile, ignored by IDE > cmake --build _builds --config "${CONFIG}" # Build Debug in IDE, ignored by Makefile > (cd _builds && ctest -VV -C "${CONFIG}") # Test Debug in IDE, ignored by Makefile 

坏模式

 if(CMAKE_BUILD_TYPE STREQUAL Debug) # Burn it with fire!!! set(CMAKE_BUILD_TYPE MySuperRelease) # Be ready to catch a bug from IDE user... 

好的

 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} --my-debug-flags") 

工作很好。

 target_compile_definitions(MyTarget PUBLIC "$<$<CONFIG:Debug>:MYDEBUG_MACRO>") 

谢谢! :)你为一个程序员节省了一天的时间。

用Makefile工作,我很高兴…

有人引用了你可能认识的一个好人的好书(重点是我的):

你为什么要打扰? 在各种系统上编程或使用各种编译器的人都很在意,因为如果他们不这样做的话,他们不得不浪费时间来查找和修复难以理解的错误。 声称不关心可移植性的人通常是这样做的,因为他们只使用单一的系统,并且认为他们可以承担“我的编译器实现的语言”的态度。“这是一个狭隘短视的观点。 如果你的程序是成功的,它很可能被移植,所以有人将不得不寻找和解决与实现相关的function相关的问题。 另外,程序通常需要与其他编译器一起编译,才能在同一个系统上编译,甚至你最喜欢的编译器的未来版本可能会做一些不同于现有编译器的东西。 在编写程序时,了解和限制实现依赖关系的影响要比事后解决混乱要容易得多。