对于 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
将为您的编译器添加适当的标志。还有 RelWithDebInfo
和 MinSizeRel
构建配置。
您可以通过指定可以在其中添加 CMAKE_<LANG>_FLAGS_<CONFIG>_INIT
变量的 toolchain file 来修改/添加标志,例如:
set(CMAKE_CXX_FLAGS_DEBUG_INIT "-Wall")
set(CMAKE_CXX_FLAGS_RELEASE_INIT "-Wall")
有关详细信息,请参阅 CMAKE_BUILD_TYPE。
至于你的第三个问题,我不确定你到底在问什么。 CMake 应该自动检测并使用适合您不同源文件的编译器。
这里的很多答案都已过时/不好。因此,我将尝试更好地回答它。当然,我将在 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: 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 编译一个嵌套库?
你最后一个问题真的没有意义。
有关调试/发布标志,请参阅 CMAKE_BUILD_TYPE
变量(您将其作为 cmake -DCMAKE_BUILD_TYPE=value
传递)。它采用 Release
、Debug
等值。
https://gitlab.kitware.com/cmake/community/wikis/doc/cmake/Useful-Variables#compilers-and-tools
cmake 使用扩展名来选择编译器,因此只需将文件命名为 .c。
您可以使用各种设置覆盖它:
例如:
set_source_files_properties(yourfile.c LANGUAGE CXX)
会用 g++ 编译 .c 文件。上面的链接还显示了如何为 C/C++ 选择特定的编译器。
您可以使用 add_compile_options
,而不是直接操作 CMAKE_CXX_FLAGS
字符串(使用 string(APPEND CMAKE_CXX_FLAGS_DEBUG " -g3")
可以更好地完成):
add_compile_options(
"-Wall" "-Wpedantic" "-Wextra" "-fexceptions"
"$<$<CONFIG:DEBUG>:-O0;-g3;-ggdb>"
)
这会将指定的警告添加到所有构建类型,但只会将给定的调试标志添加到 DEBUG
构建。请注意,编译选项存储为 CMake 列表,它只是一个用分号 ;
分隔其元素的字符串。
list(APPEND CMAKE_CXX_FLAGS_DEBUG "-g3")
不会在 -g3 终止命令并启动新命令 -g3 之前添加分号,这肯定会失败?
CMAKE_CXX_FLAGS
不是 一个 cmake 列表,而是一串以空格分隔的命令行标志。我发现这种行为不一致...
如果您想在不重新生成的情况下构建不同的配置(如果使用),您还可以运行 cmake --build {$PWD} --config <cfg>
对于多配置工具,请选择 <cfg>
ex。调试、发布、MinSizeRel、RelWithDebInfo
https://cmake.org/cmake/help/v2.8.11/cmake.html#opt%3a--builddir
--config
选项没有任何结果。它不会像 -DCMAKE_BUILD_TYPE=
那样影响 $<CONFIG>
变量。
cmake --build $PWD --config <cfg>
,顺便说一句。
cmake --help
未显示 --config
是有效参数。也许它已被弃用?当我使用 --config
cmake 返回 CMake Error: Unknown argument --config
// CMakeLists.txt : 发布
set(CMAKE_CONFIGURATION_TYPES "Release" CACHE STRING "" FORCE)
// CMakeLists.txt : 调试
set(CMAKE_CONFIGURATION_TYPES "Debug" CACHE STRING "" FORCE)
CMAKE_CONFIGURATION_TYPES
包含 CMAKE_BUILD_TYPE
的可能值。因此,您应该按照其他答案的建议设置后者。也许您的解决方案有效,因为它将可能的选择限制为您想要的选择。
cmake -i ..
,因此 cmake 将以交互方式运行,询问您想要哪种类型的构建(None、Release、Debug、MinSizeRel、RelWithDebInfo)。-i
选项导致此错误消息:The "cmake -i" wizard mode is no longer supported.
。我正在使用 cmake 3.7.13.0.0
起,它似乎已被弃用。 Reference。CMAKE_BUILD_TYPE
,cmake 将不会选择任何默认构建类型,因此生成的编译器命令行将不会匹配任何构建配置。