如何在Linux上将googleTest设置为共享库


87

Debian不再为gTest提供任何预编译的软件包。他们建议您将框架集成到项目的makefile中。但是我想保持我的makefile干净。如何像以前的版本(<1.6.0)一样设置gTest,以便可以链接到库?


2
顺便说一句,使用自动工具管理gtest构建,因此标准./configure && make && make install工作流程应该可以正常工作。我不确定这是否值得发表,因为与从源代码编译许多其他软件包没有什么不同。
肖恩·钦

7
我想并不是所有用户都像您一样经验丰富。我最近从Windows转到Linux,我很乐意在StackOverflow上找到类似的东西。
ManuelSchneid3r 2012年

1
请注意,Google建议您不要构建库,而应在项目中包含GTest代码。见code.google.com/p/googletest/wiki/...
Mawg说起用莫妮卡

多数民众赞成在答案的第一笔记。
ManuelSchneid3r 2015年

1
@Mawg提供的链接已损坏(已删除Wiki),它似乎可以正常工作,但指向的页面不再是主题(非常令人困惑)。作为替代品,我能找到的最好的是这些构建说明:github.com/google/googletest/blob/master/googletest/README.md但是,这仅说明了如何使用cmake进行构建。对于自动工具,我找到了以下最有效的答案:stackoverflow.com/a/36000856/1487069
Carlo Wood,

Answers:


143

开始之前,请确保您已阅读并理解 Google的注释!本教程使使用gtest变得容易,但可能会引入讨厌的错误

1.获取googletest框架

wget https://github.com/google/googletest/archive/release-1.8.0.tar.gz

手工获取。我不会保留这小小的“操作方法”,因此,如果您偶然发现了它,并且链接已过时,请随时对其进行编辑。

2.解压并构建Google测试

tar xf release-1.8.0.tar.gz
cd googletest-release-1.8.0
cmake -DBUILD_SHARED_LIBS=ON .
make

3.在系统上“安装”标题和库。

此步骤可能因发行版而异,因此请确保将标头和库复制到正确的目录中。我通过检查Debians以前的gtest库所在的位置来实现这一点。但我敢肯定,有更好的方法可以做到这一点。注意:make install很危险,不支持

sudo cp -a googletest/include/gtest /usr/include
sudo cp -a googlemock/gtest/libgtest_main.so googlemock/gtest/libgtest.so /usr/lib/

4.更新链接器的缓存

...并检查GNU Linker是否知道这些库

sudo ldconfig -v | grep gtest

如果输出如下所示:

libgtest.so.0 -> libgtest.so.0.0.0
libgtest_main.so.0 -> libgtest_main.so.0.0.0

那一切都很好

gTestframework现在可以使用了。只是不要忘记通过设置-lgtest为链接器标志和(如果未编写自己的测试主例程的话)显式-lgtest_main标志来选择将项目链接到库。

从这里开始,您可能想要转到Googles文档以及有关该框架的旧文档,以了解其工作原理。祝您编码愉快!

编辑: 这也适用于OS X!请参阅“如何在OS X上正确设置googleTest”


2
没有make install可以代替手动复制库和标头的目标吗?
肖恩·钦

13
引用makefile的输出:'make install' is dangerous and not supported. Instead, see README for how to integrate Google Test into your build system.
ManuelSchneid3r 2012年

文件是否已在1.8.0版本中重命名?没有include/gtest,据我可以告诉。
Nubcake

2
您的帖子已过期。请不要误导人们,sudo cp -a libgtest_main.so libgtest.so /usr/lib/不再起作用。该文件甚至都没有开始。
Schütze

我还想知道为什么debian删除了预安装的共享库(根据上游建议,他们这样做了:bugs.debian.org/cgi-bin/bugreport.cgi?bug=802587)。但是,那里给出的Wiki链接不再存在。那么为什么会这样呢?
卡罗·伍德

33

让我专门针对ubuntu用户回答。首先从安装gtest开发包开始。

sudo apt-get install libgtest-dev

请注意,此软件包仅安装源文件。您必须自己编译代码才能创建必要的库文件。这些源文件应位于/ usr / src / gtest。浏览到此文件夹并使用cmake编译库:

sudo apt-get install cmake # install cmake
cd /usr/src/gtest
sudo mkdir build
cd build
sudo cmake ..
sudo make
sudo make install

现在要编译使用gtest的程序,您必须将其链接到:

-lgtest -lgtest_main -lpthread

这对我在Ubuntu 14.04LTS上非常有效。


1
实际上,您不必手动复制库,Makefile中有一个目标。您可以这样操作:sudo apt-get install cmake#install cmake cd / usr / src / gtest sudo cmake CMakeLists.txt sudo make install应该构建并复制/ usr / local / lib /
Alexander Zinovyev

1
@AlexanderZinovyev我得到“ make:***没有使目标'install'停止的规则。” 当我执行“ sudo make install”时
m4l490n

2
“ sudo make install”在Ubuntu 18.04上有效,但在Ubuntu 16.04上无效。
艾哈迈德·纳萨尔

1
@AhmedNassar:“ sudo make install”与“ sudo cp * .a / usr / lib”具有相同的作用。因此,如果生成的Makefile中没有安装选项,则只需手动复制它们即可
amritkrs

无需手动sudo cp *.a /usr/lib,只需重新安装它就sudo make install可以了。
lingjiankong

26

我花了一些时间才弄清楚这一点,因为常规的“ make install”已被删除,我不使用cmake。这是我的经验分享。在工作中,我在Linux上没有超级用户访问权限,因此我在主目录下安装了Google测试框架:~/usr/gtest/

要将软件包作为共享库安装在〜/ usr / gtest /中,还包括示例构建:

$ mkdir ~/temp
$ cd ~/temp
$ unzip gtest-1.7.0.zip 
$ cd gtest-1.7.0
$ mkdir mybuild
$ cd mybuild
$ cmake -DBUILD_SHARED_LIBS=ON -Dgtest_build_samples=ON -G"Unix Makefiles" ..
$ make
$ cp -r ../include/gtest ~/usr/gtest/include/
$ cp lib*.so ~/usr/gtest/lib

要验证安装,请使用以下test.c作为简单的测试示例:

    #include <gtest/gtest.h>
    TEST(MathTest, TwoPlusTwoEqualsFour) {
        EXPECT_EQ(2 + 2, 4);
    }

    int main(int argc, char **argv) {
        ::testing::InitGoogleTest( &argc, argv );
        return RUN_ALL_TESTS();
    }

编译:

    $ export GTEST_HOME=~/usr/gtest
    $ export LD_LIBRARY_PATH=$GTEST_HOME/lib:$LD_LIBRARY_PATH
    $ g++ -I $GTEST_HOME/include -L $GTEST_HOME/lib -lgtest -lgtest_main -lpthread test.cpp 

1
在最后一行,我得到错误:/ usr / bin / ld:/tmp/cczG727X.o:对符号'_ZN7testing4TestC2Ev'的未定义引用。我修复了将test.cpp放置在库之前的问题。即:g ++ test.cpp -I $ GTEST_HOME / include -L $ GTEST_HOME / lib -lgtest -lgtest_main -lpthread
user9869932 2015年

如果针对gtest_main(lgtest_main)进行链接,则无需main在测试文件中定义自己的文件。
Gino Mempin

10

如果碰巧正在使用CMake,则可以ExternalProject_Add此处所述使用。

这避免了您必须将gtest源代码保留在存储库中或将其安装在任何地方。它会自动下载并构建在您的构建树中。


2

Debian / Ubuntu的更新

Google Mock(程序包:)google-mock和Google Test(程序包:)libgtest-dev已合并。新的软件包称为googletest。这两个旧名称仍可用于向后兼容,现在取决于新软件包googletest

因此,要从包存储库中获取库,可以执行以下操作:

sudo apt-get install googletest -y
cd /usr/src/googletest
sudo mkdir build
cd build
sudo cmake ..
sudo make
sudo cp googlemock/*.a googlemock/gtest/*.a /usr/lib

之后,您可以链接-lgmock-lgmock_main如果您不使用自定义main方法,也可以)-lpthread。至少在我的情况下,这足以使用Google Test。

如果您想要最新版本的Google Test,请从github下载。之后,步骤类似:

git clone https://github.com/google/googletest
cd googletest
sudo mkdir build
cd build
sudo cmake ..
sudo make
sudo cp lib/*.a /usr/lib

如您所见,创建库的路径已更改。请记住,新路径也可能很快对软件包存储库有效。

您可以使用代替手动复制库sudo make install。它“当前”有效,但是请注意,它过去并不总是有效。另外,使用此命令时,您无法控制目标位置,并且您可能不想污染/usr/lib


1

同样,我对这种情况不知所措,最终为此制作了自己的Ubuntu源程序包。这些源程序包使您可以轻松生成二进制程序包。它们基于本文的最新gtest&gmock来源。

Google Test DEB源码包

Google Mock DEB源码包

要构建二进制包,请执行以下操作:

tar -xzvf gtest-1.7.0.tar.gz
cd gtest-1.7.0
dpkg-source -x gtest_1.7.0-1.dsc
cd gtest-1.7.0
dpkg-buildpackage

它可能会告诉您,您需要一些必备软件包,在这种情况下,您只需要apt-get安装它们即可。除此之外,构建的.deb二进制软件包还应该位于父目录中。

对于GMock,过程是相同的。

附带说明一下,虽然不特定于我的源代码包,但在将gtest链接到单元测试时,请确保首先包含gtest(https://bbs.archlinux.org/viewtopic.php?id=156639)普通陷阱。


当我尝试编译时,您的软件包给我错误。有什么原因吗?这是我的日志test.cpp :(。text + 0x57):对testing::Message::Message()' test.cpp:(.text+0x84): undefined reference to test :: internal :: AssertHelper :: AssertHelper(testing :: TestPartResult :: Type,char const *,int,char const *)'测试的未定义引用。 cpp :(。text + 0x97):未定义对`testing :: internal :: AssertHelper :: operator =(testing :: Message const&)const'的引用...它是如此之久以至于我无法发布整个内容。我是在全新的Ubuntu 14.04 VM中完成此操作的,因此除了必要的依赖项之外,没有安装其他任何东西。
ddelnano

@ddelnano是的,我也遇到了这个小小的Google测试宝石。显然,共享库的顺序很重要。将gtest链接到单元测试时,请尝试在其他库之前包含gtest。当我遇到此问题时,此链接为我解决了问题:bbs.archlinux.org/viewtopic.php?id=156639
Nick Weedon

@ddelnano,如果您的测试套件没有定义“ main”,那么也不要忘记链接“ gtest_main”。
Nick Weedon

我没有包括任何其他库。这就是我所保存的文件 #include <gtest/gtest.h> TEST(MathTest, TwoPlusTwoEqualsFour) { EXPECT_EQ(2 + 2, 4); } int main(int argc, char **argv) { ::testing::InitGoogleTest( &argc, argv ); return RUN_ALL_TESTS(); }
ddelnano

没关系,直到我发表评论后,我才读过博客文章。现在终于可以使用了!
ddelnano

1

以防万一其他人昨天(2016-06-22)遇到与我相同的情况,并且也无法通过已经发布的方法成功-Lubuntu 14.04使用以下命令链对我有用:

git clone https://github.com/google/googletest
cd googletest
cmake -DBUILD_SHARED_LIBS=ON .
make
cd googlemock
sudo cp ./libgmock_main.so ./gtest/libgtest.so gtest/libgtest_main.so ./libgmock.so /usr/lib/
sudo ldconfig

1

Askubuntu的这个答案对我有用。与其他选项相比,它似乎更简单,更不易出错,因为它使用包libgtest-dev从那里获取源代码并进行构建: https //askubuntu.com/questions/145887/why-no-library-files-installed-for-google-测试?answertab = votes#tab-top

请参考该答案,但作为快捷方式,我也提供以下步骤:

sudo apt-get install -y libgtest-dev
sudo apt-get install -y cmake
cd /usr/src/gtest
sudo cmake .
sudo make
sudo mv libg* /usr/lib/

之后,我可以构建我的项目,而这个项目gtest完全没有问题。


1

以下方法避免了手动混乱/usr/lib目录,同时还需要对CMakeLists.txt文件进行最小的更改。它还可以让您的软件包管理器彻底卸载libgtest-dev

这个想法是,当您libgtest-dev通过

sudo apt install libgtest-dev

源存储在位置 /usr/src/googletest

您可以简单地将您CMakeLists.txt指向该目录,以便它可以找到必要的依赖项。

只需替换FindGTestadd_subdirectory(/usr/src/googletest gtest)

最后,它应该看起来像这样

add_subdirectory(/usr/src/googletest gtest)
target_link_libraries(your_executable gtest)

0

这将在基于Ubuntu / Debian的系统中安装Google测试和模拟库:

sudo apt-get install google-mock

已在Google Cloud中基于Debian的图像进行了测试。


嗯,不,我认为这只会安装googlemock,但不会安装googletest(gtest)。至少那是发生在我身上的事情。
jotadepicas 16/12/24

0

这将构建并安装gtest和gmock 1.7.0:

mkdir /tmp/googleTestMock
tar -xvf googletest-release-1.7.0.tar.gz -C /tmp/googleTestMock
tar -xvf googlemock-release-1.7.0.tar.gz -C /tmp/googleTestMock
cd /tmp/googleTestMock
mv googletest-release-1.7.0 gtest
cd googlemock-release-1.7.0
cmake -DBUILD_SHARED_LIBS=ON .
make -j$(nproc)
sudo cp -a include/gmock /usr/include
sudo cp -a libgmock.so libgmock_main.so /usr/lib/
sudo cp -a ../gtest/include/gtest /usr/include
sudo cp -a gtest/libgtest.so gtest/libgtest_main.so /usr/lib/
sudo ldconfig

-1

对于基于@ ManuelSchneid3r的答案的1.8.1,我必须做:

wget github.com/google/googletar xf release-1.8.1.tar.gz 
tar xf release-1.8.1.tar.gz
cd googletest-release-1.8.1/
cmake -DBUILD_SHARED_LIBS=ON .
make

然后我做make install了似乎适用于1.8.1的工作,但是在@ ManuelSchneid3r之后,这意味着:

sudo cp -a googletest/include/gtest /usr/include
sudo cp -a googlemock/include/gmock /usr/include
sudo cp `find .|grep .so$` /usr/lib/

我写这个答案已经有一段时间了,如果您认为它没有价值/是无效的,请告诉我它是什么问题。
ntg
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.