CMake 中的调试与发布

新手上路,请多包涵

在 GCC 编译的项目中,

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

原文由 Cartesius00 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 825
2 个回答

使用 CMake,通常建议进行 “外源”构建。在项目的根目录中创建 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 构建配置。


您可以通过指定一个 工具链文件 来修改/添加标志,您可以在其中添加 CMAKE_<LANG>_FLAGS_<CONFIG>_INIT 变量,例如:

 set(CMAKE_CXX_FLAGS_DEBUG_INIT "-Wall")
set(CMAKE_CXX_FLAGS_RELEASE_INIT "-Wall")

有关详细信息,请参阅 CMAKE_BUILD_TYPE


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

原文由 kb1ooo 发布,翻译遵循 CC BY-SA 4.0 许可协议

这里的很多答案都已过时/不好。因此,我将尝试更好地回答它。当然,我将在 2020 年回答这个问题,所以预计情况会发生变化。


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

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

如果您使用单个配置生成器(Ninja/Unix-Makefiles),则必须指定 CMAKE_BUILD_TYPE

像这样:

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

# Actually build the binaries
cmake --build build/

# Configure a release build
cmake -S . -B build/ -D CMAKE_BUILD_TYPE=Release

# Build release binaries
cmake --build build/

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

 # Configure the build
cmake -S . -B build

# Build debug binaries
cmake --build build --config Debug

# Build release binaries
cmake --build build --config Release

如果您想知道为什么这是必要的,那是因为 cmake 不是构建系统。它是一个元构建系统(即构建构建系统的构建系统)。这基本上是处理在 1 个构建中支持多种配置的构建系统的结果。如果您想更深入地了解,我建议您阅读 Craig Scott 的书“Professional CMake: A Practical Guide”中有关 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 编译一个嵌套库?

你最后一个问题真的没有意义。

原文由 user12322620 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题