CMakeLists.txt中未使用CMAKE_BUILD_TYPE


78

我无法将默认的构建配置设置为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)

但是在构建我的项目并打开解决方案时,总是会看到Debug模式,这与我在CMakeLists文件中指定的相反。我究竟做错了什么?

我已经看过那里的其他一些问题,但是我没有看到专门针对此问题的任何内容。

CMakeLists.txt的要点。



@ usr1234567是的,我也阅读了该文件。我一定在做一些愚蠢的事情,阻止CMAKE_BUILD_TYPE了工作……
语法果糖2014年

@ usr1234567还是没有运气...还尝试了set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Configuration type" FORCE)哪些不起作用
语法果糖

4
最近2天第三次))set(CMAKE_BUILD_TYPE Release)不是它的工作方式。偶然地,这将适用于Makefile生成器,对于IDE(如Xcode和Visual Studio),此行将被忽略,因为Release / Debug在内部进行了切换。文档对此非常清楚。如果要限制构建变量,则需要设置CMAKE_CONFIGURATION_TYPES

@ruslo请发表您的评论作为答案。
usr1234567 2014年

Answers:


204

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

单一配置

类似于Make的生成器:Unix MakefilesNMake MakefilesMinGW 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 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"

将具有相同的效果:

在此处输入图片说明

这是因为所有的配置是内部(即,_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为我工作,我很高兴...

从一本不错的书中引用一个您可能认识的好人的话(强调我的话):

你为什么要打扰?在各种系统上进行编程或使用各种编译器的人们都非常在意,因为如果不这样做,他们将被迫浪费时间查找和修复难以理解的错误。谁声称他们的人不关心的可移植性通常是因为他们只使用一个单一的系统,觉得他们可以负担的态度'是什么语言我的编译器实现。“”这是一个短视视图。如果您的程序成功,则很可能会移植该程序,因此有人将不得不查找并修复与实现相关功能有关的问题。此外,对于同一系统,程序通常需要与其他编译器一起编译,甚至您喜欢的编译器的将来版本可能也会做一些与当前编译器不同的事情。知道并限制编写程序时对实现依赖性的影响要比尝试随后解开混乱更加容易。


9
哇,只要在4个小时内可用,就值得悬赏。感谢您的深入回答。
语法果糖2014年

请原谅我的无知...确切地说,我们如何将设置CMAKE_BUILD_TYPE为Release CmakeList.txt?我认为它在Control(?)部分中的某个位置,但是由于我经验不足,因此无法解析它。还要注意,我们只想设置默认值。用户的罚款会从命令行覆盖它。
jww

3
我找到了答案; -H.是一个未记录的功能
wally

1
我看到您尝试解决文档问题。感谢您的尝试。:)关于为何无法将其记录或删除(如果确实存在风险)的问题,仍然没有令人满意的答案。
wally

2
@Muscampester仅用于您的信息,最有趣的链接和解释可以在此页面

7

您还可以使用以下代码段:

if(NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING
            "Default build type: RelWithDebInfo" FORCE)
endif()

1
亲爱的,如果您不赞成提交的答案,请找几句话来说明您为什么这么做。因为在所有建议的答案中,这个简单的答案是唯一对我有用的方法。在此之前,我在这里找到了类似的“可接受”解决方案:blog.kitware.com/cmake-and-the-default-build-type
Alex

5

发生的一种可能性是其中一个子模块已CMAKE_BUILD_TYPE在缓存中设置了该值,即:

SET(CMAKE_BUILD_TYPE Debug CACHE) 

这意味着该值将从该点永久更新到配置运行结束。

跟踪此值已更改的有问题的地方的一种好方法是使用CMake的variable_watch。在您的主CMakelists.txt文件中,添加以下行

variable_watch(CMAKE_BUILD_TYPE)

每次访问此变量都会将其打印为标准错误。并将其记录到日志文件中,请执行以下操作:

cmake <your options> 2>variable_watch.log

您可能会看到类似以下内容的内容:

<...> / CMakeLists.txt:184(add_library)上的CMake调试日志:使用具有值“ Debug”的READ_ACCESS访问了变量“ CMAKE_BUILD_TYPE”。

然后,您可能会看到第一次更改CMAKE_BUILD_TYPE的点。从这里开始,您将更接近跟踪有问题的CMake行。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.