在 GCC 编译的项目中,
- 如何为每种目标类型(调试/发布)运行 CMake?
- 如何使用 CMake 指定调试和发布 C/C++ 标志?
- 如何表示将使用
g++
和一个使用gcc
的嵌套库编译主可执行文件?
原文由 Cartesius00 发布,翻译遵循 CC BY-SA 4.0 许可协议
在 GCC 编译的项目中,
g++
和一个使用 gcc
的嵌套库编译主可执行文件?原文由 Cartesius00 发布,翻译遵循 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 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
1 回答1.6k 阅读✓ 已解决
使用 CMake,通常建议进行 “外源”构建。在项目的根目录中创建
CMakeLists.txt
。然后从项目的根目录:对于
Debug
(再次从项目的根目录):Release
/Debug
将为您的编译器添加适当的标志。还有RelWithDebInfo
和MinSizeRel
构建配置。您可以通过指定一个 工具链文件 来修改/添加标志,您可以在其中添加
CMAKE_<LANG>_FLAGS_<CONFIG>_INIT
变量,例如:有关详细信息,请参阅 CMAKE_BUILD_TYPE 。
至于你的第三个问题,我不确定你到底在问什么。 CMake 应该自动检测并使用适合您不同源文件的编译器。