CMakeLists.txt中未使用CMAKE_BUILD_类型

CMakeLists.txt中未使用CMAKE_BUILD_类型,build,cmake,build-system,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) 但是在构建项目并打开解决方案时,我总是会看到调

我无法将默认生成配置设置为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文件中指定的相反。我做错了什么

我已经看了一些其他的问题,但是我没有看到任何与这个问题相关的东西


有两种类型的发电机:单配置和多配置

单一配置 像发电机一样制造:

您可以在生成步骤中设置配置类型:

cmake -H. -B_builds/Debug -DCMAKE_BUILD_TYPE=Debug "-GUnix Makefiles"
在这种情况下,构建步骤是始终调试:

多配置 IDE生成器:

忽略生成步骤上的CMAKE_BUILD_TYPE,这两个步骤都是:

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

将产生同样的效果:

这是因为所有配置都是内部配置(即,
\u builds/msvc-opaque/Release
\u builds/msvc-opaque/Debug
或其他什么,都不重要)。您可以使用
--config
选项切换:

> cmake --build _builds --config Release
cl /O2 ...
> cmake --build _builds --config Debug
cl /Od ...
控制(?) 是的,你可以。只需定义:

默认输出:

-- 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\u 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
坏模式 好的 很好用

target_compile_definitions(MyTarget PUBLIC "$<$<CONFIG:Debug>:MYDEBUG_MACRO>")
target\u编译\u定义(MyTarget PUBLIC“$”)
谢谢!:)你为一个程序员节省了一天时间

用Makefile为我工作,我很高兴。。。 你可能知道(我的)一本好书中的一些话:

你为什么要麻烦?在各种系统上编程或使用 各种编译器都非常关心,因为如果不这样做,它们就被迫浪费资源 时间查找和修复不明显的错误。声称自己不在乎的人 可移植性通常是这样做的,因为它们只使用单个系统,并且感觉 可以接受“语言就是我的编译器实现的”这种态度 这是一种狭隘和短视的观点。如果你的计划是成功的,那就是成功 可能会被移植,因此必须有人查找并修复与 依赖于实现的特性。此外,程序通常需要 与其他编译器为同一系统编译,甚至是未来版本的 您最喜欢的编译器可能会执行与当前编译器不同的操作。信息技术 在以下情况下更容易了解和限制实现依赖项的影响 编写一个程序,而不是试图在事后解决混乱


出现的一种可能性是,其中一个子模块在缓存中设置了
CMAKE\u BUILD\u TYPE
值,即:

SET(CMAKE_BUILD_TYPE Debug CACHE) 
这意味着该值将从该点永久更新到配置运行结束

跟踪该值发生更改的地方的一个好方法是使用。在主
CMakelists.txt
文件中,添加以下行

variable_watch(CMAKE_BUILD_TYPE)
这将在每次访问此变量时打印到标准错误。要将其写入日志文件,请执行以下操作:

cmake <your options> 2>variable_watch.log
cmake2>变量_watch.log
您可能会看到如下内容:

cmake <your options> 2>variable_watch.log
CMake调试日志位于/CMakeLists.txt:184(添加库): 变量“CMAKE_BUILD_TYPE”是使用带值的READ_访问访问访问的 “调试”


然后您可能会看到CMAKE_BUILD_类型首次更改的点。从这里,您将更接近于跟踪有问题的CMake行。

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

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

你清除了你的CMake缓存了吗@usr1234567是的,我也读过那个文件。我一定是做了什么蠢事,阻止了
CMAKE\u BUILD\u TYPE
的工作…@usr1234567仍然不走运。。。还尝试了
set(CMAKE\u BUILD\u TYPE“Release”缓存字符串“Configuration TYPE”FORCE)
在过去2天内第三次不起作用)
set(CMAKE\u BUILD\u TYPE Release)
这不是它的工作方式。意外地,这将适用于
Makefile
generator,对于像Xcode和visualstudio这样的IDE,这一行将被忽略,因为发布/调试在内部切换。这一点很清楚。如果你想限制你的构建变体,你需要设置@ruslo Post你的评论作为答案,请。哇,这值得一个悬赏答案,一旦它在4小时内可用。谢谢你这么深入的回答。请原谅我的无知。。。我们如何将
CMAKE\u BUILD\u类型设置为Release
CmakeList.txt
?我想它在节控件(?)的某个地方,但我在解析它时遇到了困难,因为我太没有经验了。还要注意,我们只想设置默认值;用户可以从命令行覆盖它<代码>-H.
是一个。我看到你了。谢谢您的尝试。:)关于为什么不能记录或删除(如果真的有风险的话),仍然没有令人满意的答案。@Muscampester仅为获取您的信息,可以在人们身上找到最有趣的链接和解释,如果您对提交的答案投了反对票,请用几句话说明您为什么这么做。因为在所有建议的答案中,这个简单的答案是唯一对我有效的。在此之前,我在这里找到了类似的“公认”解决方案:
SET(CMAKE_BUILD_TYPE Debug CACHE) 
variable_watch(CMAKE_BUILD_TYPE)
cmake <your options> 2>variable_watch.log
if(NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING
            "Default build type: RelWithDebInfo" FORCE)
endif()