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

Posted

技术标签:

【中文标题】如何在 Linux 上将 googleTest 设置为共享库【英文标题】:How to set up googleTest as a shared library on Linux 【发布时间】:2012-11-10 22:08:43 【问题描述】:

Debian 不再为 gTest 提供任何预编译的软件包。他们建议您将框架集成到项目的 makefile 中。但我想保持我的 makefile 干净。如何像以前的版本 (

【问题讨论】:

顺便说一句,gtest 构建是使用自动工具管理的,因此标准的 ./configure && make && make install 工作流程应该可以正常工作。我不确定这是否值得发帖,因为它与从源代码编译许多其他包没有什么不同。 我猜不是所有的用户都像你一样有经验。我最近从 Windows 转到 Linux,我很高兴在 *** 上找到类似的东西。 请注意,Google 建议您不要构建库,而是将 GTest 代码包含到您的项目中。见code.google.com/p/googletest/wiki/… 这是答案中的第一个注释。 @Mawg 提供的链接已损坏(wiki 已被删除),它似乎可以工作,但指向的页面不再是主题(相当混乱)。我能找到的最好的替代品是这些构建说明:github.com/google/googletest/blob/master/googletest/README.md 但是,这仅说明了如何使用 cmake 构建。对于自动工具,我发现以下答案效果最好:***.com/a/36000856/1487069 【参考方案1】:

在开始之前,请确保您已阅读并理解 this note from Google!本教程使 gtest 的使用变得简单,但可能会介绍nasty bugs。

1。获取 googletest 框架

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

或通过hand 获取。我不会维护这个小指南,所以如果你偶然发现它并且链接已经过时,请随时编辑它。

2。解压并构建谷歌测试

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

3。在系统上“安装”头文件和库。

此步骤可能因发行版而异,因此请确保将标头和库复制到正确的目录中。我通过检查Debians former gtest libs 的位置来完成此操作。但我确信有更好的方法来做到这一点。注意: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 链接器是否知道库

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 标志。

从这里开始,您可能想访问 Google 的 documentation 和 old docs,了解框架的工作原理。编码愉快!

编辑: 这也适用于 OS X!见"How to properly setup googleTest on OS X"

【讨论】:

没有make install 可以用来代替手动复制库和头文件的目标吗? makefile 输出的引用:'make install' is dangerous and not supported. Instead, see README for how to integrate Google Test into your build system. 1.8.0版本的文件改名了吗?据我所知,没有include/gtest 您的帖子已过期。请不要误导人们,sudo cp -a libgtest_main.so libgtest.so /usr/lib/ 不再起作用。该文件甚至不存在。 我也想知道为什么 debian 删除了预安装的共享库(他们按照上游的建议这样做了:bugs.debian.org/cgi-bin/bugreport.cgi?bug=802587)。但是,那里给出的 wiki 链接不再存在。那么为什么会这样呢?【参考方案2】:

让我专门为 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 上非常适合我。

【讨论】:

其实不用手动复制库,Makefile里有一个target。你可以这样做: sudo apt-get install cmake # install cmake cd /usr/src/gtest sudo cmake CMakeLists.txt sudo make install 那应该被构建并复制 /usr/local/lib/ @AlexanderZinovyev 我得到“make: *** No rule to make target ‘install’。停止。”当我执行“sudo make install” "sudo make install" 适用于 Ubuntu 18.04,但不适用于 Ubuntu 16.04。 @AhmedNassar:“sudo make install”与“sudo cp *.a /usr/lib”的作用相同。因此,如果生成的 Makefile 中没有安装选项,您只需手动复制它们 不用手动sudo cp *.a /usr/lib,换成sudo make install就可以了。【参考方案3】:

我花了一段时间才弄清楚这一点,因为正常的“make install”已被删除,而我不使用 cmake。这里是我的经验分享。在工作中,我在 Linux 上没有 root 访问权限,所以我在我的主目录下安装了 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 

【讨论】:

最后一行出现错误:/usr/bin/ld: /tmp/cczG727X.o: undefined reference to symbol '_ZN7testing4TestC2Ev'。我在库之前修复了这个放置 test.cpp 的问题。即:g++ test.cpp -I $GTEST_HOME/include -L $GTEST_HOME/lib -lgtest -lgtest_main -lpthread 如果链接 gtest_main (lgtest_main),则无需在测试文件中定义自己的main【参考方案4】:

如果您碰巧使用 CMake,则可以使用 ExternalProject_Add,如 here 所述。

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

【讨论】:

【参考方案5】:

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(如果您不使用自定义 main 方法,则可以链接到 -lgmock_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

【讨论】:

【参考方案6】:

我同样对这种情况感到不知所措,最终为此制作了自己的 Ubuntu 源代码包。这些源代码包允许您轻松生成二进制包。它们基于本文最新的 gtest 和 gmock 源。

Google Test DEB Source Package

Google Mock DEB Source Package

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

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): undefined reference to testing::Message::Message()' test.cpp:(.text+0x84): undefined reference to testing::internal::AssertHelper::AssertHelper(testing::TestPartResult::Type, char const*, int, char const*) ' test.cpp:(.text+0x97): undefined reference to `testing::internal::AssertHelper::operator=(testing::Message const&) const' ...它太长了,我不能发布整个事物。我在一个全新的 Ubuntu 14.04 VM 中完成了这项工作,所以除了必要的依赖项之外没有安装其他任何东西。 @ddelnano 是的,我也遇到了这个小小的谷歌测试宝石。显然共享库的顺序很重要。将 gtest 链接到您的单元测试时,请尝试在其他库之前包含 gtest。当我遇到这个问题时,这个链接为我解决了这个问题:bbs.archlinux.org/viewtopic.php?id=156639 @ddelnano,如果你的测试套件没有定义'main',那么不要忘记链接到'gtest_main'。 我没有包含任何其他库。这就是我文件中的全部内容#include &lt;gtest/gtest.h&gt; TEST(MathTest, TwoPlusTwoEqualsFour) EXPECT_EQ(2 + 2, 4); int main(int argc, char **argv) ::testing::InitGoogleTest( &amp;argc, argv ); return RUN_ALL_TESTS(); 没关系,直到我发布该评论后我才阅读博客文章。它现在终于可以工作了!【参考方案7】:

以防万一其他人昨天(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

【讨论】:

【参考方案8】:

来自 askubuntu 的这个答案对我有用。似乎比其他选项更简单,更不容易出错,因为它使用包 libgtest-dev 从那里获取源代码和构建:https://askubuntu.com/questions/145887/why-no-library-files-installed-for-google-test?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 的项目。

【讨论】:

【参考方案9】:

以下方法可以避免手动弄乱/usr/lib 目录,同时还需要对CMakeLists.txt 文件进行最少的更改。它还可以让你的包管理器干净地卸载libgtest-dev

这个想法是当你通过

获得libgtest-dev包时
sudo apt install libgtest-dev

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

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

只需将FindGTest 替换为add_subdirectory(/usr/src/googletest gtest)

最后应该是这个样子

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

【讨论】:

【参考方案10】:

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

sudo apt-get install google-mock

在基于 debian 的映像中在谷歌云中测试。

【讨论】:

嗯,不,我认为这只会安装googlemock,但不会安装googletest (gtest)。至少那是发生在我身上的事情。【参考方案11】:

这将构建和安装 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

【讨论】:

【参考方案12】:

1.8.1 基于@ManuelSchneid3r 的回答 我必须这样做:

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/

【讨论】:

我写这个答案已经有一段时间了,如果您认为它没有价值/无效,请告诉我它有什么问题。

以上是关于如何在 Linux 上将 googleTest 设置为共享库的主要内容,如果未能解决你的问题,请参考以下文章

如何在网络技术上将倒计时计时器设为特定日期和时间

如何通过为用户提供将其设为默认应用程序的选项,在设备上将应用程序设为默认电话或助理处理程序

GoogleTest初探

如何在 Linux 上将波特率设置为 307,200?

如何在 LINUX 上将 LLVM 恢复为旧版本?

如何在 Xcode 4.6 中使用 googletest 实现 c++ 单元测试?