使用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
相关产品推荐
相关产品推荐

