我在尝试安装 Google C++ Mocking Framework 时遇到了困难。我已成功运行sudo apt-get install google-mock
。然后我尝试编译此示例文件
#include "gmock/gmock.h"
int main(int argc, char** argv) {
::testing::InitGoogleMock(&argc, argv);
return RUN_ALL_TESTS();
}
并且g++ -lgmock main.cpp
这些错误已经显示
main.cpp:(.text+0x1e): undefined reference to `testing::InitGoogleMock(int*, char**)'
main.cpp:(.text+0x23): undefined reference to `testing::UnitTest::GetInstance()'
main.cpp:(.text+0x2b): undefined reference to `testing::UnitTest::Run()'
collect2: error: ld returned 1 exit status
我猜是链接器找不到库文件。有人知道如何修复吗?
答案1
好的,我现在已经成功开始使用 gmock,按照从 googlemock 项目网站下载的源文件中提供的 README 构建我自己的版本。
从网站获取下载 zip 文件: http://code.google.com/p/googlemock/downloads/list
将其解压到一个目录,例如${GMOCK_ROOT}
。然后,按照自述文件说明:
cd ${GMOCK_ROOT}
mkdir build
cd build
g++ -I../gtest/include -I../gtest -I../include -I.. -c ../gtest/src/gtest-all.cc
g++ -I../gtest/include -I../gtest -I../include -I.. -c ../src/gmock-all.cc
ar -rv libgmock.a gtest-all.o gmock-all.o
因此,您在 中拥有自己的 libgmock.a ${GMOCK_ROOT}/build
。实际上,您还需要 pthreads 进行编译,因此之后的编译命令变为:
g++ -I${GMOCK_ROOT}/include/ main.cpp -L${GMOCK_ROOT}/build -lgmock -lpthread
答案2
libgmock-dev将包含在默认的 Ubuntu 18.10 存储库中,否则在早期的 Ubuntu 版本中您必须手动下载并安装它。
sudo apt-get install libgmock-dev
cd /usr/src/googletest/googlemock/
sudo mkdir build
sudo cmake ..
sudo make
sudo cp googlemock/*.a /usr/lib
答案3
为了给 Pavel 的回答提供背景信息,编译后的 Google Mock 二进制文件未随 Ubuntu 软件包一起分发,原因如下这里。此解释针对的是 Google Test,但其原理适用于任何 C++ 库。
具体来说,它说:
早期我们说过,你可以使用 make install 在 *nix 系统上安装已编译的 Google Test 库。这样,你机器的每个用户都可以编写测试,而无需重新编译 Google Test。
这似乎是一个好主意,但它有一个问题:每个用户都需要使用与编译已安装的 Google 测试库相同的编译器标志来编译他的测试;否则他可能会遇到未定义的行为(即,测试可能表现得很奇怪,甚至可能因为没有明显的原因而崩溃)。
为什么?因为 C++ 有一条称为“单一定义规则”的规定:如果两个 C++ 源文件包含同一个类/函数/变量的不同定义,并且您将它们链接在一起,则违反了该规则。链接器可能会也可能不会捕获错误(在许多情况下,C++ 标准并不要求它捕获违规行为)。如果没有,您将得到意想不到的、难以调试的奇怪运行时行为。
如果您使用不同的编译器标志编译 Google Test 和测试代码,它们可能会看到同一类/函数/变量的不同定义(例如,由于在 Google Test 中使用了 #if)。因此,为了您的理智,我们建议避免安装预编译的 Google Test 库。相反,每个项目都应该编译 Google Test 本身,以确保 Google Test 和测试使用相同的标志。
所以你最初的问题是因为安装google-mock
包只安装了源代码,而当你尝试编译示例应用程序时,找不到 gmock 库。
答案4
我尝试在 Ubuntu 18.04.3 LTS 上安装“gmock”及其安装相关的所有内容。我使用两个文件夹“/tmp”和“/gmock”,当缺少“gmock”时,我得到:
Could NOT find GMock (missing: GMOCK_LIBRARY GMOCK_MAIN_LIBRARY)
Configuring done
Generating done
安装 gmock:
# snap install --classic cmake
# apt install g++
# export PATH="/snap/bin:$PATH"
# VERSION='1.7.0'
# INSTALL_DIR='/usr/local'
# mkdir ~/.mydownload && DOWNLOAD_DIR='~/.mydownload'
# cd ~/.mydownload
# GTEST_TARFILE="gtest-${VERSION}.tar.gz"
# GTEST_DIR='gtest'
# wget -O $GTEST_TARFILE https://github.com/google/googletest/archive/release-${VERSION}.tar.gz
# tar xzvf $GTEST_TARFILE
# mv googletest-release-${VERSION} $GTEST_DIR
# GMOCK_TARFILE="gmock-${VERSION}.tar.gz"
# GMOCK_DIR="gmock"
# wget -O $GMOCK_TARFILE https://github.com/google/googlemock/archive/release-${VERSION}.tar.gz
# tar xzvf $GMOCK_TARFILE
# mv googlemock-release-${VERSION} $GMOCK_DIR
# cd ~/.mydownload/gmock
# cmake .
# make
# mkdir -p ${INSTALL_DIR}/include
# cp -r include/gmock ${INSTALL_DIR}/include
# cp -r ../${GTEST_DIR}/include/gtest ${INSTALL_DIR}/include
# mkdir -p ${INSTALL_DIR}/lib
# cp *.a ${INSTALL_DIR}/lib
# cp gtest/*.a ${INSTALL_DIR}/lib
# cd /home/user
# rm -r ~/.mydownload
执行这些命令后,我看到了“gmock”:
Found GMock: /usr/local/lib/libgmock.a
Configuring done
Generating done