生成器有两种类型:单配置和多配置。
单一配置
类似于Make的生成器:Unix Makefiles,NMake Makefiles,MinGW Makefiles,...
您可以在生成步骤中设置配置类型:
cmake -H. -B_builds/Debug -DCMAKE_BUILD_TYPE=Debug "-GUnix Makefiles"
在这种情况下,构建步骤始终为 Debug:
> 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 ...
多种配置
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"
将具有相同的效果:
这是因为所有的配置是内部(即,_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
您甚至可以定义自己的配置类型:
> 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"
并构建:
cmake --build _builds --config MyRelease
杂乱的 (?)
如果您知道这个窍门,那就一点也不知道:)这是如何在脚本/ CI服务器/文档的构建说明等中构建/测试配置:
> 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为我工作,我很高兴...
从一本不错的书中引用一个您可能认识的好人的话(强调我的话):
你为什么要打扰?在各种系统上进行编程或使用各种编译器的人们都非常在意,因为如果不这样做,他们将被迫浪费时间查找和修复难以理解的错误。谁声称他们的人不关心的可移植性通常是因为他们只使用一个单一的系统,觉得他们可以负担的态度'是什么语言我的编译器实现。“”这是一个窄和短视视图。如果您的程序成功,则很可能会移植该程序,因此有人将不得不查找并修复与实现相关功能有关的问题。此外,对于同一系统,程序通常需要与其他编译器一起编译,甚至您喜欢的编译器的将来版本可能也会做一些与当前编译器不同的事情。知道并限制编写程序时对实现依赖性的影响要比尝试随后解开混乱更加容易。