CMake中的调试与发布

时间:2011-10-11 10:26:55

标签: c++ c gcc cmake

在GCC编译的项目中,

  • 如何为每种目标类型(调试/发布)运行CMake?
  • 如何使用CMake指定调试和发布C / C ++标志?
  • 如何表达主要可执行文件将使用g++和一个嵌套库编译gcc

6 个答案:

答案 0 :(得分:557)

使用CMake,通常建议执行"out of source" build。在项目的根目录中创建CMakeLists.txt。然后从项目的根目录开始:

mkdir Release
cd Release
cmake -DCMAKE_BUILD_TYPE=Release ..
make

对于Debug(再次来自项目的根目录):

mkdir Debug
cd Debug
cmake -DCMAKE_BUILD_TYPE=Debug ..
make

Release / Debug将为您的编译器添加适当的标志。还有RelWithDebInfoMinSizeRel构建配置。


您可以通过CMakeLists.txtCMAKE_C_FLAGS_DEBUG变量修改/添加CMAKE_C_FLAGS_RELEASE中的标记,例如:

set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wall")

有关详细信息,请参阅CMAKE_BUILD_TYPE


至于你的第三个问题,我不确定你究竟在问什么。 CMake应该自动检测并使用适合您不同源文件的编译器。

答案 1 :(得分:18)

对于调试/发布标志,请参阅CMAKE_BUILD_TYPE变量(将其作为cmake -DCMAKE_BUILD_TYPE=value传递)。它需要ReleaseDebug等值。

http://cmake.org/Wiki/CMake_Useful_Variables#Compilers_and_Tools

cmake使用扩展名来选择编译器,因此只需将文件命名为.c。

您可以使用各种设置覆盖它:

例如:

set_source_files_properties(yourfile.c LANGUAGE CXX) 

用g ++编译.c文件。上面的链接还说明了如何为C / C ++选择特定的编译器。

答案 2 :(得分:8)

您可以直接使用CMAKE_CXX_FLAGS

,而不是直接操作string(APPEND CMAKE_CXX_FLAGS_DEBUG " -g3")字符串(使用add_compiler_options btw可以更好地完成操作)。

add_compile_options(
  "-Wall" "-Wpedantic" "-Wextra" "-fexceptions"
  "$<$<CONFIG:DEBUG>:-O0;-g3;-ggdb>"
)

这会将指定的警告添加到所有构建类型,但仅将给定的调试标志添加到DEBUG构建。请注意,编译选项存储为CMake列表,这只是一个用分号;分隔其元素的字符串。

答案 3 :(得分:6)

这里的许多答案都是过时/不好的。因此,我将尝试更好地回答。当然,我要在2020年回答这个问题,所以预计情况会有所改变。


如何为每种目标类型(调试/发布)运行CMake?

首先调试/发布称为cmake(nitpick)中的配置。

如果您使用单个配置生成器(Ninja / Unix-Makefiles)

然后,每个配置都需要一个构建文件夹。

赞:

# Configure the build
cmake -S . -B build/Debug -D CMAKE_BUILD_TYPE=Release

# Actually build the binaries
cmake --build build/Debug

对于多配置生成器,它略有不同(Ninja Multi-Config,Visual Studio)

# Configure the build
cmake -S . -B build

# Actually build the binaries
cmake --build build --config Debug

如果您想知道为什么这样做是必要的,那是因为cmake不是构建系统。这是一个元构建系统(即构建构建系统的构建系统)。这基本上是在1个构建中处理支持多种配置的构建系统的结果。如果您想更深入地了解,我建议您在Craig Scott的书“ Professional CMake:实用指南


如何使用CMake指定调试和发布C / C ++标志?

现代做法是使用目标的和属性。

这里是一个例子:

add_library(foobar)

# Add this compile definition for debug builds, this same logic works for
# target_compile_options, target_link_options, etc.
target_compile_definitions(foobar PRIVATE
    $<$<CONFIG:Debug>:
        FOOBAR_DEBUG=1
    >
)

注意:我如何使用生成器表达式来指定配置! 使用CMAKE_BUILD_TYPE将导致任何多配置生成器的构建都不正确!

有时,您还需要全局设置内容,而不仅仅是针对一个目标。 使用add_compile_definitions,add_compile_options等。这些函数支持生成器表达式。除非必要,否则不要使用旧式cmake(那条路是一场噩梦)


我如何表示将使用g ++编译主可执行文件,并使用gcc编译一个嵌套库?

您的最后一个问题确实没有道理。

答案 4 :(得分:5)

如果您要构建其他配置而无需重新生成,则也可以运行cmake --build {$PWD} --config <cfg>。对于多配置工具,请选择<cfg> ex。调试,发布,MinSizeRel,RelWithDebInfo

https://cmake.org/cmake/help/v2.8.11/cmake.html#opt%3a--builddir

答案 5 :(得分:3)

// CMakeLists.txt : release

var mongoose     = require('mongoose');
var Schema       = mongoose.Schema;

var TestSchema = new Schema({
    ip : { type : String },
    port : { type : String },
    msgboard : [{type : Schema.Types.ObjectId, ref : 'msgboard'}]   
});

module.exports = mongoose.model('Test', TestSchema);

// CMakeLists.txt : debug

set(CMAKE_CONFIGURATION_TYPES "Release" CACHE STRING "" FORCE)