我是 gtest/gmock 的新手。我正在尝试为 C++ 程序实施单元测试。但是当我尝试编译它时。我遇到了与 gmock 的链接错误。这个特定的错误是相关的
testing::internal::GetCurrentOsStackTraceExceptTop
.
gtest/gmock的安装:
第 1 步:
sudo apt-get install libgtest-dev
sudo cmake CMakeLists.txt
sudo make
第五步:复制/usr/lib中的文件
第 6 步:将 gtest/gmock include 文件夹复制到 /usr/local/include
version of the Google Test library that is installed on my system is 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
看起来您正在使用来自 2 个不同来源的 gmock/gtest 库。第一个来源是您安装的
libgtest-dev
,第二个是 github 存储库。您应该使用libgtest-dev
或github repo中的那个。
testing::internal::GetCurrentOsStackTraceExceptTop[abi:cxx11](int)
在libgtest
中定义。 libgmock
取决于libgtest
。因此-lgtest
应该遵循-lgmock
:
g++ update.cpp library.cpp -lboost_thread -pthread -lboost_filesystem -lgmock -lgtest -lgmock_main
不要将
-lstdc++
与 g++ 一起使用。这是默认的。正确的方法是-stdlib=stdc++
.
请参阅为什么链接库的顺序有时会导致 GCC 出错? 以获取更多信息。你的问题可以被认为是一个骗局。
如果您使用手动安装的 github 存储库,请确保您没有安装
libgmock-dev
和 libgtest-dev
sudo apt-get remove libgtest-dev
解决了我的兼容性问题