在GCC编译的项目中,
- 如何为每种目标类型(调试/发布)运行CMake?
- 如何使用CMake指定调试和发布C / C ++标志?
- 我如何表示将使用编译主可执行文件
g++
并使用一个嵌套库gcc
?
在GCC编译的项目中,
g++
并使用一个嵌套库gcc
?Answers:
对于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
将为您的编译器添加适当的标志。也有RelWithDebInfo
和MinSizeRel
构建配置。
您可以通过指定可以在其中添加和变量的工具链文件来修改/添加到标志,例如:CMAKE_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应该自动检测并使用适合于您的不同源文件的编译器。
-i
选项导致此错误消息:The "cmake -i" wizard mode is no longer supported.
。我正在使用cmake 3.7.1
CMAKE_BUILD_TYPE
未设置,则cmake不会选择任何默认的构建类型,因此生成的编译器命令行将不匹配任何构建配置。
有关调试/释放标志,请参见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 ++选择特定的编译器。
除了CMAKE_CXX_FLAGS
直接操作字符串(使用string(APPEND CMAKE_CXX_FLAGS_DEBUG " -g3")
btw 可以更好地完成操作),您可以使用add_compiler_options
:
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
选项没有任何结果。它不会$<CONFIG>
像-DCMAKE_BUILD_TYPE=
那样影响变量。
// 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可以交互运行,询问您想要哪种类型的构建(无,发布,调试,MinSizeRel,RelWithDebInfo)。