You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 23:30:45