CakeKE_BUILD_TYPE未在CMakeLists.txt中使用

时间:2014-06-27 20:43:08

标签: build cmake build-system

我无法将默认构建配置设置为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文件中指定的相反。我究竟做错了什么?我在那里看了一些其他问题,但没有看到任何特定于这个问题的内容。

CMakeLists.txt

的要点

3 个答案:

答案 0 :(得分:145)

有两种类型的发生器:单配置和多配置。

单一配置

Make-like generator:Unix MakefilesNMake MakefilesMinGW 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 StudioXcode

生成步骤中的

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"

会产生同样的效果:

enter image description here

这是因为所有配置都是内部的(即_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

enter image description here

您甚至可以定义自己的配置类型:

> 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"

enter image description here

并建立:

  

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为我工作,我很高兴......

有些引用了一本你可能知道的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线。