我无法将默认构建配置设置为Release,在我的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)
但是在构建我的项目并打开解决方案时,我总是会遇到调试模式,这与我在CMakeLists文件中指定的相反。我究竟做错了什么?我在那里看了一些其他问题,但没有看到任何特定于这个问题的内容。
的要点答案 0 :(得分:145)
有两种类型的发生器:单配置和多配置。
Make-like generator:Unix Makefiles,NMake Makefiles,MinGW Makefiles,...
您可以在生成步骤
上设置配置类型cmake -H. -B_builds/Debug -DCMAKE_BUILD_TYPE=Debug "-GUnix Makefiles"
在这种情况下,构建步骤始终调试:
> 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>")
谢谢! :)你为一个程序员节省了一天。
有些引用了一本你可能知道的nice guy的好书(强调我的):
你为什么要打扰?在各种系统上编程或使用的人 各种编译器都非常关心,因为如果他们不这样做,就会被迫浪费 时间找到并修复晦涩的错误。声称他们不关心的人 可移植性通常是这样做的,因为他们只使用一个系统并感受到它们 能够承受“语言是我的编译器所实现的语言”的态度。 这是一个狭窄和短视视图。如果您的计划成功,那就是 可能被移植,所以有人必须找到并解决与之相关的问题 实现依赖功能。此外,程序通常需要 与其他编译器一起编译用于同一系统,甚至是未来的版本 你最喜欢的编译器可能会做一些与当前编译器不同的东西。它 更容易了解并限制实现依赖性的影响 一个程序的编写,而不是试图解决后来的混乱。
答案 1 :(得分:7)
您还可以使用以下代码段:
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING
"Default build type: RelWithDebInfo" FORCE)
endif()
答案 2 :(得分:1)
发生的一种可能性是其中一个子模块已在缓存中设置CMAKE_BUILD_TYPE
值,即:
SET(CMAKE_BUILD_TYPE Debug CACHE)
表示从该点到配置运行结束将永久更新该值。
跟踪此值已更改的有问题的地方的一种好方法是使用cmake's variable_watch。在您的主要CMakelists.txt
文件中,添加以下行
variable_watch(CMAKE_BUILD_TYPE)
这将在每次访问此变量时显示为标准错误。并将其记录到日志文件中,请执行以下操作:
cmake <your options> 2>variable_watch.log
您可能会看到类似的内容
位于...... / CMakeLists.txt:184(add_library)上的CMake调试日志: 使用READ_ACCESS和值访问变量“ CMAKE_BUILD_TYPE” “调试”。
然后,您可能会看到CMAKE_BUILD_TYPE首次更改的点。并且从这里您将更接近跟踪有问题的cmake线。