c++ - 如何在使用 Visual Studio 编译的 Cmake 项目中正确设置调试标志

标签 c++ visual-studio qt cmake

我有一个在 Linux 和 Windows 上编译的 C++ CMake 项目。在 Windows 上,这是通过 Visual Studio/MSVCC 完成的。

在 CMAKE 和 VS 中,build设置为“调试”,但 VS 构建中似乎没有生成任何调试符号 - 因此不可能进行调试。

当查看 VS 的详细输出时,我看到了这个:

cl:命令行警告 D9002:忽略未知选项“-g”

这表明它不能像 GCC/Clang 那样识别 -g 标志。

这是 CMake 参数:

SET(CMAKE_CXX_STANDARD 17)
SET(CMAKE_CXX_STANDARD_REQUIRED ON)
SET(BUILD_MODE Debug)
SET(CMAKE_CXX_FLAGS "-Wall")
SET(CMAKE_CXX_FLAGS_DEBUG "-g")
SET(CMAKE_CXX_FLAGS_RELEASE "-O3")

如何使其与 Visual Studio 兼容?我尝试过全部查看,但大多数相关帖子似乎都是关于 C#/.net 或更旧版本的 VS。

如果重要的话,该项目确实使用了 QT 库。

更新:

原来BUILD_MODE是别人添加的东西,这样每个子项目就不需要单独设置为发布或调试,我们只需在根级Cmakelists中设置一次即可。他们确实都按照预期使用了 CMAKE_BUILD_TYPE 。

此外,这里的答案是正确的。直接设置 CMAKE_CXX_FLAGS 会清除默认值,导致调试版本没有 MSVCC 中的/Zi 等选项,从而阻止调试符号和所有调试。它还引入了 MSVCC 无法理解的无法识别的标志“-g”。

我从项目中的每个 Cmakelists.txt 中完全删除了 SET_CXX_FLAGS,并且一切正常。

如果我需要添加它们,我将按照建议使用 _INIT 选项。

最佳答案

您必须使用 CMAKE_BUILD_TYPE 设置不同的模式进行编译,如下所示

cmake -DCMAKE_BUILD_TYPE=DEBUG <sourcedir>

您永远不会直接设置这些标志。如果您想向 Debug模式添加新标志(例如堆栈保护器),则应使用 *_INIT 变量。

您可以使用 UNIXWIN32MSVC cmake bool 预定义常量进一步区分您正在运行的操作系统:

if ( UNIX )
set( CMAKE_CXX_FLAGS_DEBUG_INIT "-fstack-protector" )
elseif( WIN32 )
set( CMAKE_CXX_FLAGS_DEBUG_INIT "/GS" )
endif()

关于c++ - 如何在使用 Visual Studio 编译的 Cmake 项目中正确设置调试标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73573133/

相关文章:

android - 调试使用 vs-android 构建的 Android 原生应用程序

c++ - QT 将文本翻译成特定的语言环境

macos - Visual Studio Cloud Explorer 的 OS X 替代方案

c++ - 如何设置 QGraphicsItemGroup 的显示范围?

c++ - 使用 CMakeLists.txt 构建 qt 编译输出 make : *** No rule to make target `all' . Stop

c++ - 需要帮助弄清楚为什么我会遇到这个段错误

c++ - 无法实例化类

c++ - '=' 标记之前预期的构造函数、析构函数或类型转换”

c++ - C1001 : An internal error has occurred in the compiler when including <boost/shared_ptr. hpp>

visual-studio - 阻止一次选择文本或一次选择多个文本