在GCC编译的项目中,
g++
gcc
h6my8fg21#
对于CMake,通常建议进行“源代码外”构建。在项目的根目录中创建CMakeLists.txt。然后从项目的根目录开始:
CMakeLists.txt
mkdir Releasecd Releasecmake -DCMAKE_BUILD_TYPE=Release ..make
mkdir Release
cd Release
cmake -DCMAKE_BUILD_TYPE=Release ..
make
对于Debug(也是从项目的根目录开始):
Debug
mkdir Debugcd Debugcmake -DCMAKE_BUILD_TYPE=Debug ..make
mkdir Debug
cd Debug
cmake -DCMAKE_BUILD_TYPE=Debug ..
Release/Debug将为您的编译器添加适当的标志。此外,还有RelWithDebInfo和MinSizeRel构建配置。您可以通过指定toolchain file来修改/添加标志,在toolchain file中可以添加CMAKE_<LANG>_FLAGS_<CONFIG>_INIT变量,例如:
Release
RelWithDebInfo
MinSizeRel
CMAKE_<LANG>_FLAGS_<CONFIG>_INIT
set(CMAKE_CXX_FLAGS_DEBUG_INIT "-Wall")set(CMAKE_CXX_FLAGS_RELEASE_INIT "-Wall")
set(CMAKE_CXX_FLAGS_DEBUG_INIT "-Wall")
set(CMAKE_CXX_FLAGS_RELEASE_INIT "-Wall")
有关详细信息,请参阅CMAKE_BUILD_TYPE。至于你的第三个问题,我不确定你到底在问什么。CMake应该自动检测并使用适合你的不同源文件的编译器。
qyuhtwio2#
这里的很多答案都过时了/不好。所以我会尝试回答得更好。当然,我是在2020年回答这个问题的,所以预计情况会发生变化。
如何为每种目标类型运行CMake(调试/发布)?
首先,调试/发布在cmake中被称为配置(nitpick)。如果使用单个配置生成器(Ninja/Unix-Makefiles),则必须指定CMAKE_BUILD_TYPE。就像这样:
# Configure the buildcmake -S . -B build/ -D CMAKE_BUILD_TYPE=Debug# Actually build the binariescmake --build build/# Configure a release buildcmake -S . -B build/ -D CMAKE_BUILD_TYPE=Release# Build release binariescmake --build build/
# 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
对于多配置生成器,它略有不同(Ninja Multi-Config、Visual Studio)
# Configure the buildcmake -S . -B build# Build debug binariescmake --build build --config Debug# Build release binariescmake --build build --config Release
cmake -S . -B build
# Build debug binaries
cmake --build build --config Debug
cmake --build build --config Release
如果你想知道为什么有必要这样做,那是因为cmake不是一个构建系统。它是一个元构建系统(即构建的构建系统的构建系统)。这基本上是处理在一个构建中支持多个配置的构建系统的结果。如果你想更深入地理解,我建议你阅读克雷格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 >)
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编译一个嵌套库?
你的最后一个问题真的没有意义。
lsmd5eda3#
有关调试/发布标志,请参见CMAKE_BUILD_TYPE变量(您将其作为cmake -DCMAKE_BUILD_TYPE=value传递)。它接受Release、Debug等值。https://gitlab.kitware.com/cmake/community/wikis/doc/cmake/Useful-Variables#compilers-and-toolscmake使用扩展名来选择编译器,因此只需将文件命名为. c即可。您可以使用各种设置覆盖此设置:例如:
CMAKE_BUILD_TYPE
cmake -DCMAKE_BUILD_TYPE=value
set_source_files_properties(yourfile.c LANGUAGE CXX)
会用g编译.c文件。上面的链接还显示了如何为C/C选择特定的编译器。
f87krz0w4#
您可以使用add_compile_options来代替直接操作CMAKE_CXX_FLAGS字符串(使用string(APPEND CMAKE_CXX_FLAGS_DEBUG " -g3") btw可以更好地完成此操作):
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>")
add_compile_options(
"-Wall" "-Wpedantic" "-Wextra" "-fexceptions"
"$<$<CONFIG:DEBUG>:-O0;-g3;-ggdb>"
这会将指定的警告添加到所有生成类型,但只将给定的调试标志添加到DEBUG生成。请注意,编译选项存储为CMake列表,该列表只是一个用分号;分隔其元素的字符串。
DEBUG
;
zy1mlcev5#
如果要生成不同的配置而不重新生成,如果使用,还可以运行cmake --build {$PWD} --config <cfg>对于多配置工具,请选择<cfg>,例如Debug、Release、MinSizeRel、RelWithDebInfohttps://cmake.org/cmake/help/v2.8.11/cmake.html#opt%3a--builddir
cmake --build {$PWD} --config <cfg>
<cfg>
fdbelqdn6#
//CMakeLists.txt格式的文件:释放
set(CMAKE_CONFIGURATION_TYPES "Release" CACHE STRING "" FORCE)
//CMakeLists.txt格式的文件:除错
set(CMAKE_CONFIGURATION_TYPES "Debug" CACHE STRING "" FORCE)
6条答案
按热度按时间h6my8fg21#
对于CMake,通常建议进行“源代码外”构建。在项目的根目录中创建
CMakeLists.txt
。然后从项目的根目录开始:对于
Debug
(也是从项目的根目录开始):Release
/Debug
将为您的编译器添加适当的标志。此外,还有RelWithDebInfo
和MinSizeRel
构建配置。您可以通过指定toolchain file来修改/添加标志,在toolchain file中可以添加
CMAKE_<LANG>_FLAGS_<CONFIG>_INIT
变量,例如:有关详细信息,请参阅CMAKE_BUILD_TYPE。
至于你的第三个问题,我不确定你到底在问什么。CMake应该自动检测并使用适合你的不同源文件的编译器。
qyuhtwio2#
这里的很多答案都过时了/不好。所以我会尝试回答得更好。当然,我是在2020年回答这个问题的,所以预计情况会发生变化。
如何为每种目标类型运行CMake(调试/发布)?
首先,调试/发布在cmake中被称为配置(nitpick)。
如果使用单个配置生成器(Ninja/Unix-Makefiles),则必须指定CMAKE_BUILD_TYPE。
就像这样:
对于多配置生成器,它略有不同(Ninja Multi-Config、Visual Studio)
如果你想知道为什么有必要这样做,那是因为cmake不是一个构建系统。它是一个元构建系统(即构建的构建系统的构建系统)。这基本上是处理在一个构建中支持多个配置的构建系统的结果。如果你想更深入地理解,我建议你阅读克雷格Scott的书“Professional CMake:实用指南
如何使用CMake指定调试与发布C/C++标志?
现代的实践是利用目标的特性。
下面是一个示例:
注意:我是如何使用生成器表达式来指定配置的!使用CMAKE_BUILD_TYPE将导致任何多配置生成器的错误构建!
此外,有时候你需要全局设置,而不是只针对一个目标。使用add_compile_definitions,add_compile_options等。这些函数支持生成器表达式。除非你不得不,否则不要使用老式的cmake(那是一个噩梦之地)。
如何表示将使用g++编译主可执行文件,并使用gcc编译一个嵌套库?
你的最后一个问题真的没有意义。
lsmd5eda3#
有关调试/发布标志,请参见
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即可。
您可以使用各种设置覆盖此设置:
例如:
会用g编译.c文件。上面的链接还显示了如何为C/C选择特定的编译器。
f87krz0w4#
您可以使用
add_compile_options
来代替直接操作CMAKE_CXX_FLAGS
字符串(使用string(APPEND CMAKE_CXX_FLAGS_DEBUG " -g3")
btw可以更好地完成此操作):这会将指定的警告添加到所有生成类型,但只将给定的调试标志添加到
DEBUG
生成。请注意,编译选项存储为CMake列表,该列表只是一个用分号;
分隔其元素的字符串。zy1mlcev5#
如果要生成不同的配置而不重新生成,如果使用,还可以运行
cmake --build {$PWD} --config <cfg>
对于多配置工具,请选择<cfg>
,例如Debug、Release、MinSizeRel、RelWithDebInfohttps://cmake.org/cmake/help/v2.8.11/cmake.html#opt%3a--builddir
fdbelqdn6#
//CMakeLists.txt格式的文件:释放
//CMakeLists.txt格式的文件:除错