2 回答
TA贡献1806条经验 获得超5个赞
有两种类型的发生器:单配置和多配置。
单一配置
类似Make的生成器:Unix Makefiles,NMake Makefiles,MinGW 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 Studio,Xcode
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为我工作,我很高兴...
从一个漂亮的书中的一些报价好人,你可能知道(重点煤矿):
你为什么要打扰?在各种系统上编程或使用各种编译器的人非常关心,因为如果他们不这样做,他们就不得不浪费时间寻找和修复模糊的错误。声称他们不关心可移植性的人通常会这样做,因为他们只使用一个系统,并且觉得他们能够承担“我的编译器实现的语言”的态度。这是一个狭隘和短视的视图。如果您的程序成功,则可能会被移植,因此有人必须找到并修复与实现相关的功能相关的问题。此外,程序通常需要与同一系统的其他编译器一起编译,甚至您喜欢的编译器的未来版本可能会做一些与当前版本不同的东西。在编写程序时,了解并限制实现依赖性的影响要比在之后尝试解决混乱更容易。
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线。
添加回答
举报