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

GTest项目CMake构建链接错误修复:非命令行运行解决方案

解决GTest在CMake构建中出现未定义引用的链接错误

我之前也碰到过一模一样的问题——手动编译安装GTest后,用g++命令行编译测试代码完全正常,但CMake构建就一堆testing相关函数的未定义引用错误。核心原因很简单:你在命令行里手动指定了链接GTest库和线程库,但CMake配置里没做这件事。

下面给你几种靠谱的解决方案,按推荐程度排序:

方案1:用CMake的find_package自动查找GTest(推荐)

因为你已经把GTest库安装到了系统默认的/usr/lib路径,CMake的find_package可以自动找到它的头文件和库文件。只需要写一个简单的CMakeLists.txt:

cmake_minimum_required(VERSION 3.10)
project(AddTest)

# 查找系统中的GTest库
find_package(GTest REQUIRED)
# 引入GTest的头文件路径
include_directories(${GTEST_INCLUDE_DIRS})

# 生成测试可执行文件
add_executable(test main.cpp)

# 链接GTest库和线程库(GTest依赖pthread)
target_link_libraries(test PRIVATE ${GTEST_LIBRARIES} pthread)

把这个文件放到和你的main.cpp同目录下,然后执行常规的CMake构建步骤:

mkdir build && cd build
cmake ..
make
./test

方案2:手动指定库和头文件路径(适合自定义安装路径)

如果find_package没找到GTest(比如你把库装在了非系统默认路径),可以手动指定头文件和库的位置:

cmake_minimum_required(VERSION 3.10)
project(AddTest)

# 指定GTest的头文件路径(如果你的头文件不在/usr/include/gtest,替换成实际路径)
include_directories(/usr/include/gtest)

# 生成测试可执行文件
add_executable(test main.cpp)

# 手动链接GTest库和线程库
target_link_libraries(test PRIVATE gtest pthread)

方案3:用FetchContent自动下载构建GTest(最省心的跨平台方案)

手动安装GTest容易遇到路径、版本兼容问题,更推荐用CMake的FetchContent模块,让CMake自动下载、编译GTest,完全不用手动安装:

cmake_minimum_required(VERSION 3.14)
project(AddTest)

# 引入FetchContent模块
include(FetchContent)
# 声明要获取的GTest版本(这里用v1.14.0,你可以换成最新版)
FetchContent_Declare(
  googletest
  URL https://github.com/google/googletest/archive/refs/tags/v1.14.0.zip
)
# Windows下防止覆盖父项目的编译设置,Linux/macOS可以忽略这条
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
# 下载并构建GTest
FetchContent_MakeAvailable(googletest)

# 生成测试可执行文件
add_executable(test main.cpp)
# 链接GTest的main库(包含了main函数,你甚至可以删掉自己写的main函数)
target_link_libraries(test PRIVATE GTest::gtest_main)

# 启用CMake的测试功能,方便后续运行测试
enable_testing()
add_test(NAME AddTest COMMAND test)

用这个方案的话,你甚至不需要提前安装GTest,CMake会帮你搞定一切,而且跨平台兼容性更好。

为什么命令行没问题?

你用g++ main.cpp -o test -lgtest -lpthread的时候,-lgtest告诉编译器链接GTest库,-lpthread链接线程库(GTest内部用到了线程)。而默认的CMake配置不会自动帮你链接这些库,所以才会出现未定义引用的错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:06:31