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

使用CMake FetchContent引入GoogleTest构建C++库时出现链接错误

问题描述

开发个人C++库项目时,原通过本地克隆GoogleTest仓库并使用add_subdirectory集成单元测试可正常工作,改为CMake的FetchContent自动下载GoogleTest后,构建出现链接错误:

C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: cannot find -lgoogletest: No such file or directory

导致tests.exe链接失败,构建退出码为2,运行ctest提示无可用执行目标。清理build目录重新构建后问题仍存在。

项目结构:

MyLibrary/
│
├── googletest/ (本地克隆的GitHub仓库)
│
├── src/
│   └── 所有源文件
│
├── tests/
│   ├── CMakeLists.txt
│   └── tests.cpp
│
├── CMakeLists.txt (主配置文件)
└── README.md

错误原因分析

主CMakeLists.txt中错误地将googletest链接到了业务库MyLibrary:

target_link_libraries(${This} googletest)
  • MyLibrary作为业务库,本身不需要依赖GoogleTest测试框架
  • FetchContent方式引入GoogleTest时,生成的是命名空间目标(如GTest::gtest、GTest::gtest_main),而非旧的googletest目标名,直接链接会导致CMake找不到对应库文件

解决方案

1. 修正主CMakeLists.txt

移除业务库对GoogleTest的不必要链接,修改后的配置如下:

cmake_minimum_required(VERSION 3.27.2)

set (This MyLibrary)

project (${This} C CXX)

set (CMAKE_C_STANDARD 99)
set (CMAKE_CXX_STANDARD 11)
set (CMAKE_POSITION_INDEPENDENT_CODE ON)

enable_testing ()

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

set (Headers
    # 所有头文件
)

set (Sources
    # 所有源文件(不含tests.cpp)
)

set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
FetchContent_MakeAvailable(googletest)

add_library (${This} STATIC ${Sources} ${Headers})
# 移除不必要的GoogleTest链接
# target_link_libraries(${This} googletest)

add_subdirectory(tests)

2. 确认测试目录CMakeLists.txt配置

测试程序配置已正确使用FetchContent生成的命名空间目标,无需修改:

cmake_minimum_required(VERSION 3.27.2)

set (This tests)

set (Sources
    tests.cpp
)

add_executable (${This} ${Sources})
target_link_libraries (${This} PRIVATE
    GTest::gtest_main
    MyLibrary
)

add_test (
    NAME ${This}
    COMMAND ${This}
)

include(GoogleTest)
gtest_discover_tests(tests)

3. 重新构建

  • 彻底删除原build目录
  • 重新执行CMake配置与构建:
cmake -S . -B build
cmake --build build

额外说明

FetchContent引入GoogleTest时,官方推荐使用命名空间目标(GTest::gtest、GTest::gtest_main、GTest::gmock等),而非直接使用旧的目标名(如gtest、googletest),可避免版本兼容问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 09:14:54