如何在Ubuntu 12.10上安装google-mock

我在尝试安装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

我猜链接器找不到库文件。有人知道怎么解决吗?
4个回答

好的,我现在已经成功开始使用gmock,按照从googlemock项目网站下载的源代码中提供的README构建了自己的版本。
从网站上下载zip文件: http://code.google.com/p/googlemock/downloads/list 将其解压到一个目录中,比如${GMOCK_ROOT}。然后,根据README说明进行操作:
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

因此,你在${GMOCK_ROOT}/build中有自己的libgmock.a。实际上,你还需要pthreads来进行编译,所以在那之后你的编译命令变成了:
g++ -I${GMOCK_ROOT}/include/ main.cpp -L${GMOCK_ROOT}/build -lgmock -lpthread

确认它有效。干得好!我只是想知道为什么g++的参数顺序很重要。 - Slazer

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

请尝试以下建议并确保您添加详细的解释: - Juan Antonio

为了给Pavel的答案提供背景,编译好的Google Mock二进制文件没有与Ubuntu软件包一起分发,原因可以在这里找到。尽管这个解释是针对Google Test的,但是这个原则适用于任何C++库。
具体来说,它说:
在早期,我们说过你可以使用make install在*nix系统上安装编译好的Google Test库。然后你机器上的每个用户都可以编写测试而无需重新编译Google Test。
这似乎是个好主意,但有一个问题:每个用户需要使用与安装Google Test库时相同的编译器标志来编译他们的测试;否则他们可能会遇到未定义的行为(即测试可能会表现奇怪,甚至因为没有明显的原因而崩溃)。
为什么呢?因为C++有一个叫做“单一定义规则”的东西:如果两个C++源文件包含了相同的类/函数/变量的不同定义,并且你将它们链接在一起,那么你就违反了这个规则。链接器可能会或可能不会捕获这个错误(在许多情况下,C++标准并不要求捕获这种违规)。如果没有捕获,你会得到一些奇怪的运行时行为,这些行为是意外的,也很难调试。
如果你使用不同的编译器标志来编译Google Test和你的测试代码,它们可能会看到相同类/函数/变量的不同定义(例如由于在Google Test中使用#if)。因此,为了保持清晰,我们建议避免安装预编译的Google Test库。相反,每个项目应该自己编译Google Test,以确保对Google Test和测试使用相同的标志。
所以你的原始问题是因为安装了google-mock包只安装了源代码,当你尝试编译示例应用程序时,找不到gmock库。

4我想知道为什么是这样的。有很多在/lib目录下预编译工作的C++库。 - Slazer

我尝试在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