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

使用gtest/gmock编译C++单元测试时遇链接错误:未定义GetCurrentOsStackTraceExceptTop

gmock链接错误:未定义引用testing::internal::GetCurrentOsStackTraceExceptTop

问题场景

作为gtest/gmock新手,在为C++程序编写单元测试时,编译阶段触发gmock相关链接错误,具体报错为未定义引用testing::internal::GetCurrentOsStackTraceExceptTop。

已执行的安装步骤

  • 执行sudo apt-get install libgtest-dev
  • 下载Google Test源码仓库
  • 执行sudo apt install cmake
  • 在googletest目录下运行:
sudo cmake CMakeLists.txt
sudo make
  • 将编译生成的文件复制到/usr/lib
  • 将gtest/gmock的include文件夹复制到/usr/local/include

系统已安装的Google Test版本为1.10.0-2。

测试代码(test.cpp)

#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include <gmock/gmock-actions.h>
#include <iostream>
#include "timeEvent.h"

using ::testing::_;
using ::testing::Return;

class MockStat {
 public:
  MOCK_METHOD2(stat, int(const char* pathname, struct stat* buf));
};

TEST(MyTest, PositiveCase) {
  MockStat mock_stat;
  struct stat fileStat;
  fileStat.st_mtime = 111;
  fileStat.st_ctime = 222;
  
  EXPECT_CALL(mock_stat, stat("/var/lib/systemd/timesync/clock", &fileStat))
      .WillOnce(Return(0));
  
  auto latest_clock = get_latest_clock_entry();
  EXPECT_EQ(latest_clock.tv_sec, 111);
  EXPECT_EQ(latest_clock.tv_nsec, 0);
}

使用的编译命令

g++ test.cpp library.cpp -lgtest -lgtest_main -lpthread -lboost_thread -pthread -lboost_filesystem -lgtest -lgmock -lgmock_main

错误信息

g++ update.cpp library.cpp -lgtest -lgtest_main -lpthread -lboost_thread -pthread -lboost_filesystem -lgtest -lgmock -lgmock_main -lstdc++
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libgmock.a(gmock-all.cc.o): in function `testing::internal::Log(testing::internal::LogSeverity, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)':
gmock-all.cc:(.text+0x121a): undefined reference to `testing::internal::GetCurrentOsStackTraceExceptTop[abi:cxx11](int)'
collect2: error: ld returned 1 exit status

解决方案

1. 清理版本冲突

你同时通过apt安装了预编译包,又手动编译了源码版本,导致系统中存在两套不兼容的gtest/gmock库,这是符号不匹配的核心原因:

  • 移除apt安装的包:
sudo apt purge libgtest-dev
  • 删除手动复制的库文件和头文件:
sudo rm -rf /usr/lib/libgtest* /usr/lib/libgmock*
sudo rm -rf /usr/local/include/gtest /usr/local/include/gmock
  • 重新编译源码,指定C++11及以上标准(确保与你的项目编译标准一致):
cd googletest && mkdir build && cd build
cmake -DCMAKE_CXX_STANDARD=11 ..
make
sudo make install

2. 调整链接顺序

链接库的顺序直接影响符号解析,gmock依赖gtest,因此-lgmock要放在-lgtest之前,且避免重复指定库:

g++ test.cpp library.cpp -lgmock -lgmock_main -lgtest -lgtest_main -lpthread -lboost_thread -lboost_filesystem

(注:-pthread与-lpthread重复,保留其一即可)

3. 统一C++编译标准

确保编译测试代码时,使用与gtest/gmock编译时一致的C++标准,比如添加-std=c++11:

g++ -std=c++11 test.cpp library.cpp -lgmock -lgmock_main -lgtest -lgtest_main -lpthread -lboost_thread -lboost_filesystem

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 14:30:40