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

Visual Studio中CMake配置GoogleTest报错:无法打开头文件'gtest/gtest.h'

问题:无法找到GoogleTest头文件gtest.h

在项目tests目录下的C++文件中引入#include <gtest/gtest.h>时,编译器提示找不到该头文件,项目相关细节如下:

项目结构

Root Directory:
- CMakeLists.txt
- tests
  - test_main.cpp
  - calc_test.cpp
- src
  - calc.cpp

CMakeLists.txt 内容

cmake_minimum_required(VERSION 3.14)
project("EX1") # Replace 

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

include(FetchContent)
FetchContent_Declare(
    googletest
    URL https://github.com/google/googletest/archive/03597a01ee50ed33e9dfd640b249b4be3799d395.zip
)

FetchContent_MakeAvailable(googletest)

enable_testing()

set(SOURCE_FILES
    src/calc.cpp # this is where the code we want to test
)

set(TEST_FILES
    tests/test_main.cpp # this is the main for tests
    tests/calc_test.cpp # this file contains the tests
)

add_executable(CalcTests ${TEST_FILES} ${SOURCE_FILES})

target_link_libraries(CalcTests PRIVATE gtest gtest_main)

target_include_directories(CalcTests PRIVATE src)

include(GoogleTest)
add_test(NAME CalcTests COMMAND CalcTests)

calc_test.cpp 内容

#include <gtest/gtest.h>
#include "../src/calc.cpp" // here we include the code to be tested
TEST(SumTest, BasicTest) {
    EXPECT_EQ(sum(1,2), 3);
}

test_main.cpp 内容

#include <gtest/gtest.h>
int main(int argc, char** argv) {
::testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

解决方案

核心问题是CMake配置中未正确传递GoogleTest的头文件路径,虽然FetchContent拉取了源码,但链接目标的方式不够规范。以下是修正后的配置和优化建议:

修正后的CMakeLists.txt

cmake_minimum_required(VERSION 3.14)
project("EX1")

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

include(FetchContent)
FetchContent_Declare(
    googletest
    URL https://github.com/google/googletest/archive/03597a01ee50ed33e9dfd640b249b4be3799d395.zip
    FETCHCONTENT_UPDATES_DISCONNECTED YES
)

# 禁用GoogleTest自带的测试和安装流程,避免干扰主项目
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
FetchContent_MakeAvailable(googletest)

enable_testing()

# 将源码打包为静态库,替代直接包含cpp文件的做法
add_library(CalcLib STATIC src/calc.cpp)

set(TEST_FILES
    tests/test_main.cpp
    tests/calc_test.cpp
)

add_executable(CalcTests ${TEST_FILES})

# 使用规范的别名目标链接,自动传递头文件路径和链接属性
target_link_libraries(CalcTests PRIVATE CalcLib GTest::gtest GTest::gtest_main)

target_include_directories(CalcTests PRIVATE src)

# 自动发现测试用例,替代手动add_test
include(GoogleTest)
gtest_discover_tests(CalcTests)

关键优化点

  1. 使用规范的目标别名:GTest::gtest和GTest::gtest_main是GoogleTest导出的官方别名,能确保头文件路径、编译选项等属性自动传递给测试目标,直接解决找不到头文件的问题。
  2. 避免直接包含cpp文件:创建CalcLib静态库,将业务代码与测试代码分离,避免重复编译和符号冲突。同时修改calc_test.cpp为包含头文件:
    #include <gtest/gtest.h>
    #include "calc.h" // 需在src目录下创建calc.h声明sum函数
    TEST(SumTest, BasicTest) {
        EXPECT_EQ(sum(1,2), 3);
    }
    
  3. 优化FetchContent配置:添加FETCHCONTENT_UPDATES_DISCONNECTED YES避免每次构建都拉取GoogleTest源码,gtest_force_shared_crt确保运行时库一致,减少编译错误。
  4. 自动发现测试用例:gtest_discover_tests会自动扫描测试代码中的用例,无需手动添加测试目标,配置更简洁。

内容的提问来源于stack exchange,提问作者Alfa Hores

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 11:12:11