为了账号安全,请及时绑定邮箱和手机立即绑定

CakeKE_BUILD_TYPE未在CMakeLists.txt中使用

CakeKE_BUILD_TYPE未在CMakeLists.txt中使用

CakeKE_BUILD_TYPE未在CMakeLists.txt中使用我在将我的默认构建配置设置为Release时遇到问题,在我的CMakeLists.txt文件中,我在文件顶部设置了CMAKE_BUILD_TYPE#enable Release ALWAYS, configure varsset(CMAKE_BUILD_TYPE Release)set(EXECUTABLE_NAME "ParticleSimulator")set(VERSION_MAJOR 0)set(VERSION_MINOR 2)但是在构建我的项目并打开解决方案时,我总是会看到调试模式,这与我在CMakeLists文件中指定的相反。我究竟做错了什么?我在那里看了一些其他的问题,但没有看到任何特定于这个问题的东西。CMakeLists.txt的要点
查看完整描述

2 回答

?
忽然笑

TA贡献1806条经验 获得超5个赞

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

单一配置

类似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 on generate步骤被忽略,两者:

> 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 Releasecl /O2 ...> cmake --build _builds --config Debugcl /Od ...

控制 (?)

是的你可以。只需定义CMAKE_CONFIGURATION_TYPES

# Somewhere in CMakeLists.txtmessage("Generated with config types: ${CMAKE_CONFIGURATION_TYPES}")

默认输出:

-- Detecting CXX compiler ABI info - doneGenerated 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 - doneGenerated 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为我工作,我很高兴...

从一个漂亮的书中的一些报价好人,你可能知道(重点煤矿):

你为什么要打扰?在各种系统上编程或使用各种编译器的人非常关心,因为如果他们不这样做,他们就不得不浪费时间寻找和修复模糊的错误。声称他们不关心可移植性的人通常会这样做,因为他们只使用一个系统,并且觉得他们能够承担“我的编译器实现的语言”的态度。这是一个狭隘短视的视图。如果您的程序成功,则可能会被移植,因此有人必须找到并修复与实现相关的功能相关的问题。此外,程序通常需要与同一系统的其他编译器一起编译,甚至您喜欢的编译器的未来版本可能会做一些与当前版本不同的东西。在编写程序时,了解并限制实现依赖性的影响要比在之后尝试解决混乱更容易。


查看完整回答
反对 回复 2019-08-26
?
慕妹3146593

TA贡献1820条经验 获得超9个赞

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

SET(CMAKE_BUILD_TYPE Debug CACHE)

意味着该值将从该点永久更新到配置运行结束。跟踪此值发生变化的违规位置的一个好方法是使用cmake的variable_watch。在主CMakelists.txt文件中添加以下行

variable_watch(CMAKE_BUILD_TYPE)

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

cmake <your options> 2>variable_watch.log

你可能会看到类似的东西:

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

然后,您可能会看到首次更改CMAKE_BUILD_TYPE的点。从这里你将更接近追踪违规的cmake线。


查看完整回答
反对 回复 2019-08-26
  • 2 回答
  • 0 关注
  • 1300 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信