CMAKE_BUILD_TYPE有四种选项: Debug、Release、RelWithDebInfo和MinSizeRel。

9 浏览
0 Comments

CMAKE_BUILD_TYPE有四种选项: Debug、Release、RelWithDebInfo和MinSizeRel。

根据文档页面

CMAKE_BUILD_TYPE

在单配置生成器上指定构建类型。

这静态地指定了在此构建树中将构建的构建类型(配置)。可能的值为空,DebugReleaseRelWithDebInfoMinSizeRel。此变量仅对单配置生成器(如Makefile生成器Ninja)有意义,即在CMake运行以生成构建树时选择单个配置的生成器,而不是多配置生成器,后者在生成的构建环境中提供构建配置的选择。有许多按配置的属性和变量(通常按照干净的SOME_VAR_顺序约定),例如,按大写字母指定: CMAKE_C_FLAGS_[DEBUG|RELEASE|RELWITHDEBINFO|MINSIZEREL]。例如,在配置为构建类型Debug的构建树中,CMake会确保将CMAKE_C_FLAGS_DEBUG设置添加到CMAKE_C_FLAGS设置中。另请参见CMAKE_CONFIGURATION_TYPES

我知道Debug构建和Release构建之间的区别,但是ReleaseRelWithDebInfoMinSizeRel之间有什么区别呢?我猜RelWithDebInfo表示创建可调试的二进制文件,MinSizeRel表示创建尺寸最小的二进制文件。

根据LLVM CMake页面

CMAKE_BUILD_TYPE:STRING

如果您正在使用Visual Studio等IDE,则应使用IDE设置来设置构建类型。请注意,大多数平台上的Release和RelWithDebInfo在优化级别上有所不同。

如果我想生成一个生产构建,我应该选择Release吗?

0
0 Comments

CMake是一个跨平台的开源构建工具,用于管理软件的构建过程。在使用CMake构建项目时,可以使用CMAKE_BUILD_TYPE变量来指定构建类型。CMAKE_BUILD_TYPE有四个常用的选项:Debug、Release、RelWithDebInfo和MinSizeRel。

Debug类型的构建会包含调试信息,以便于在开发过程中进行调试。为了生成Debug类型的构建,CMake会添加编译器标志来生成调试信息(如GCC / clang中的-g标志)。因此,生成的二进制文件会比较大。

Release类型的构建是为了生成最终的发布版本。它会使用编译器的优化选项(如GCC / clang中的-O3标志)来优化程序的执行速度,并且不包含调试符号。因此,生成的二进制文件会比Debug类型的构建更快,但没有调试信息。

RelWithDebInfo类型的构建是为了在发布版本中添加调试信息。它会添加编译器标志来生成调试信息,但同时也会进行优化以提高程序的执行速度。因此,生成的二进制文件既可以进行调试,又相对较快。

MinSizeRel类型的构建是为了生成尽可能小的二进制文件。为了实现这一目标,CMake会添加编译器标志来生成更紧凑的二进制文件(如GCC / clang中的-Os标志),但可能会牺牲程序的执行速度。

如果想生成生产版本的构建,可以选择Release类型。它会使用优化选项来提高程序的执行速度,并且不包含调试信息。

总结起来,CMAKE_BUILD_TYPE的四个选项分别用于不同的构建需求。根据具体的需求,可以选择Debug类型进行调试、Release类型进行发布版本构建、RelWithDebInfo类型进行发布版本的调试,或者MinSizeRel类型进行尽可能小的构建。

0
0 Comments

CMAKE_BUILD_TYPE是CMake的一个变量,它定义了构建的类型。常见的类型包括Debug、Release、RelWithDebInfo和MinSizeRel。其中,RelWithDebInfo和Release是相同的,可以生成用于调试的符号文件。对于Visual Studio来说,这些符号文件的扩展名是.pdb,没有这些符号文件,调试将会变得困难,因为二进制文件中的所有签名都无法直接阅读,并且无法将它们映射到源代码。而MinSizeRel和Release也是相同的,只是将优化配置从最大速度改为最小尺寸。

如果想要生成生产版本的构建,应该选择Release。Debug和Release是最常用的选项。阅读CMake的常见问题解答可以帮助理解。需要注意的是,大多数编译器生成的RelWithDebInfo代码效率不会低于Release,但仍然会生成调试符号。如果计划将二进制文件发布给用户,并且以后需要进行调试,这将是一个巨大的优势。因此,我认为除非有非常充分的理由不使用RelWithDebInfo,否则RelWithDebInfo是一个普遍更好的选择。

默认的优化级别会有所变化。至少在gcc和clang中,RelWithDebInfo使用-O2优化级别,而Release使用-O3优化级别。无论选择哪个CMAKE_BUILD_TYPE,都可以根据需要设置自己的优化级别。

至于MinSizeRel是否可能性能较慢,我对你提到的“最大化速度”配置感到困惑。官方的CMake文档中,并未提到MinSizeRel会最大化速度,应该是这个答案给出了一些误导性的信息。

需要注意的是,目前(截至发文时),RelWithDebInfo在针对具有外部符号文件的工具链的生成器上(例如MSVC和gcc/clang的dwarf),是故意破坏的,因为它使用的优化标志与Release不同。

0
0 Comments

CMAKE_BUILD_TYPE是CMake中的一个变量,用于指定构建类型。它主要用于单目标生成器(如Makefile),而对于多目标生成器,不会使用此变量。CMAKE_BUILD_TYPE涉及以下内容:

1. 优化级别(Optimization Level):CMAKE_BUILD_TYPE可以设置不同的优化级别,包括-O0、-O1、-O2、-O3、-Ofast、-Os、-Oz、-Og、-O、-O4等。

2. 是否在可执行文件中包含调试信息(Debug Info):CMAKE_BUILD_TYPE可以设置是否在可执行文件中包含调试信息,包括-g、-gline-tables-only、-gmodules、-glevel、-gcoff、-gdwarf、-gdwarf-version、-ggdb、-grecord-gcc-switches、-gno-record-gcc-switches、-gstabs、-gstabs+、-gstrict-dwarf、-gno-strict-dwarf、-gcolumn-info、-gno-column-info、-gvms、-gxcoff、-gxcoff+、-gz[=type]等。

3. 是否生成assert()代码:CMAKE_BUILD_TYPE可以设置是否生成assert()代码,通过添加-DNDEBUG标志来禁用assert()。

4. 是否包含调试(输出)代码:CMAKE_BUILD_TYPE可以设置是否包含调试(输出)代码,这是一个自定义的选项。

这些编译器选项通常是特定于编译器和/或平台的。因此,对于支持的每种构建类型,需要更新所有现有的工具链。

CMake默认的构建类型具有以下含义:

1. Release:高优化级别、无调试信息、无代码或断言。

2. Debug:无优化、启用断言、[启用自定义调试(输出)代码],在可执行文件中包含调试信息(以便可以使用调试器逐步执行代码,并进行地址到源文件:行号的转换)。

3. RelWithDebInfo:优化的同时包含调试信息,但不包含调试(输出)代码或断言。

4. MinSizeRel:与Release相同,但优化为尺寸而不是速度。

对应的编译器标志通常是:

1. Release:-O3 -DNDEBUG

2. Debug:-O0 -g

3. RelWithDebInfo:-O2 -g -DNDEBUG

4. MinSizeRel:-Os -DNDEBUG

为了支持自定义构建类型,可以通过更改优化标志或调试标志来添加支持。可以通过定义自定义宏来添加自定义构建类型。

文章中还提到了一些常见的构建类型,如BetaTest和RelWithDebug,并给出了相应的编译器标志和宏定义。

文章最后介绍了如何在CMakeLists.txt文件中添加代码以自定义构建类型,并给出了一个示例。

总结一下,CMAKE_BUILD_TYPE变量用于指定构建类型,包括优化级别、调试信息、assert代码和调试代码等选项。使用不同的构建类型可以根据需求生成不同的可执行文件。通过修改编译器标志和宏定义,可以添加自定义构建类型。

0