>我有一个cmake
/gcc
项目,其中我启用了几个警告和标志-Werror
。
我注意到当我使用 cmake
标志-DCMAKE_BUILD_TYPE=Release
时检测到一些警告,但当我不应用上述 cmake
标志时,它们不会。例如,这些警告之一是:
error: ‘var_name’ may be used uninitialized in this function [-Werror=maybe-uninitialized]
我在这里阅读了:使用 CMake 设置 CFLAGS 和 CXXFLAGS 选项,不同的构建类型有几个CMAKE_C_FLAGS
变量,例如CMAKE_C_FLAGS_RELEASE
。
尝试将这些变量应用于发布和调试版本,但这次上述变量都没有检测到我预期的警告。
我错过了什么?
CMake 的默认/"调试"构建配置文件完全禁用优化,这会阻止编译器传递执行转换和静态分析,以确定变量是否未初始化使用。虽然这在某种程度上改善了单步源代码行的调试体验,但正如您发现的那样,它隐藏了警告,并且还倾向于隐藏代码中未定义行为的后果。
传统上,"完全禁用非发布版本的优化"在面向 unix 的开发人员中并不常见。这是MSVC世界中常见做法的延续,反映了CMake的起源和用户群。