使用GCC 11编译Googletest v1.10时遇dummy变量未初始化错误
问题
我尝试通过FetchContent_Declare为项目添加单元测试,编写了如下测试代码:
#include <gtest/gtest.h> int main(int argc, char** argv) { ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); } TEST(Example, One) { ASSERT_TRUE(true); }
对应的CMake配置文件如下:
cmake_minimum_required(VERSION 3.26) project(unittest_test) include(FetchContent) FetchContent_Declare( googletest GIT_REPOSITORY https://github.com/google/googletest.git GIT_TAG 703bd9caab50b139428cea1aaff9974ebee5742e # release-1.10.0 SYSTEM ) FetchContent_MakeAvailable(googletest) set(CMAKE_CXX_STANDARD 17) enable_testing() file(GLOB_RECURSE unittests_src CONFIGURE_DEPENDS "*.cpp") set(CMAKE_COMPILE_WARNING_AS_ERROR OFF) set_target_properties(gtest gtest_main PROPERTIES COMPILE_WARING_AS_ERROR OFF) add_executable( unittests ${unittests_src} ) target_link_libraries( unittests PUBLIC gtest gtest_main ) add_test( NAME unittests COMMAND ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR}/unit_tests )
我已在FetchContent_Declare中设置使用SYSTEM头文件,并关闭了COMPILE_WARNING_AS_ERROR,但项目仍无法编译,警告依然被当作错误处理,编译输出如下:
[main] Building folder: CMakeGTest [build] Starting build [proc] Executing command: /usr/local/bin/cmake --build /home/tom/src/CMakeGTest/build --config Debug --target all -j 22 -- [build] [ 8%] Building CXX object _deps/googletest-build/googletest/CMakeFiles/gtest.dir/src/gtest-all.cc.o [build] In file included from /home/tom/src/CMakeGTest/build/_deps/googletest-src/googletest/src/gtest-all.cc:42: [build] /home/tom/src/CMakeGTest/build/_deps/googletest-src/googletest/src/gtest-death-test.cc: In function ‘bool testing::internal::StackGrowsDown()’: [build] /home/tom/src/CMakeGTest/build/_deps/googletest-src/googletest/src/gtest-death-test.cc:1301:24: error: ‘dummy’ may be used uninitialized [-Werror=maybe-uninitialized] [build] 1301 | StackLowerThanAddress(&dummy, &result); [build] | ~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~ [build] /home/tom/src/CMakeGTest/build/_deps/googletest-src/googletest/src/gtest-death-test.cc:1290:13: note: by argument 1 of type ‘const void*’ to ‘void testing::internal::StackLowerThanAddress(const void*, bool*)’ declared here [build] 1290 | static void StackLowerThanAddress(const void* ptr, bool* result) { [build] | ^~~~~~~~~~~~~~~~~~~~~ [build] /home/tom/src/CMakeGTest/build/_deps/googletest-src/googletest/src/gtest-death-test.cc:1299:7: note: ‘dummy’ declared here [build] 1299 | int dummy; [build] | ^~~~~ [build] cc1plus: all warnings being treated as errors [build] gmake[2]: *** [_deps/googletest-build/googletest/CMakeFiles/gtest.dir/build.make:76: _deps/googletest-build/googletest/CMakeFiles/gtest.dir/src/gtest-all.cc.o] Error 1 [build] gmake[1]: *** [CMakeFiles/Makefile2:216: _deps/googletest-build/googletest/CMakeFiles/gtest.dir/all] Error 2 [build] gmake: *** [Makefile:146: all] Error 2 [proc] The command: /usr/local/bin/cmake --build /home/tom/src/CMakeGTest/build --config Debug --target all -j 22 -- exited with code: 2 [build] Build finished with exit code 2
环境信息:GCC 11.3.0 x86_64-linux-gnu,CMake版本3.26.0-rc1。
解决方法
修正CMake属性拼写错误
你设置gtest和gtest_main属性时写错了:COMPILE_WARING_AS_ERROR应该是COMPILE_WARNING_AS_ERROR(缺少字母N),这导致该属性未被正确应用到gtest目标,警告转错误的规则依然生效。调整全局编译选项的时机
建议在FetchContent_MakeAvailable(googletest)之前就关闭全局的CMAKE_COMPILE_WARNING_AS_ERROR,避免第三方依赖继承错误的编译规则:set(CMAKE_COMPILE_WARNING_AS_ERROR OFF) FetchContent_MakeAvailable(googletest)或者针对所有gtest相关目标单独设置(注意拼写正确):
set_target_properties(gtest gtest_main gmock gmock_main PROPERTIES COMPILE_WARNING_AS_ERROR OFF)升级gtest版本
你使用的gtest 1.10.0版本较旧,这个maybe-uninitialized的警告在1.11.0及以上版本已被修复。建议更换GIT_TAG为最新稳定版,比如:GIT_TAG release-1.14.0修正测试命令路径
add_test中的命令路径写错了:目标名称是unittests,但路径里写的是unit_tests,应该改为:add_test( NAME unittests COMMAND ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR}/unittests )
内容的提问来源于stack exchange,提问作者Tom McLean
相关产品推荐
相关产品推荐

