CMakeLists.txt中未使用CMAKE_BUILD_类型
我无法将默认生成配置设置为Release。在我的CMakeLists.txt文件中,我在文件顶部设置了CMAKE_BUILD_TYPE,如下所示: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) 但是在构建项目并打开解决方案时,我总是会看到调
#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类型设置为ReleaseCmakeList.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()