繁体   English   中英

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

[英]How to set up googleTest as a shared library on Linux

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

在开始之前,请确保您已阅读并理解Google 的这篇笔记 本教程使 gtest 的使用变得简单,但可能会引入令人讨厌的错误

1.获取googletest框架

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

或者手动获取。 我不会维护这个小操作方法,所以如果你偶然发现它并且链接已经过时,请随时编辑它。

2. 解压并构建google test

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

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

此步骤可能因发行版而异,因此请确保将标头和库复制到正确的目录中。 我通过检查Debian 以前的 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链接器是否知道库

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 文档和有关该框架的旧文档以了解其工作原理。 快乐编码!

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

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

我花了一段时间才弄清楚这一点,因为正常的“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 

如果你碰巧使用CMake的,你可以使用ExternalProject_Add描述这里

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

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

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

谷歌测试 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 ) 这似乎是一个常见问题。

以防万一其他人昨天(2016 年 6 月 22 日)遇到和我一样的情况,并且使用已经发布的方法也没有成功 - 在Lubuntu 14.04它使用以下命令链对我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

来自 askubuntu 的这个答案对我有用。 似乎比其他选项更简单,更不容易出错,因为它使用包libgtest-dev从那里获取源和构建: https : libgtest-dev -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构建依赖于gtest项目。

以下方法避免了手动弄乱/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)

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

sudo apt-get install google-mock

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

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

使用busterbullseye可以安装以下三个包而无需编译任何东西:

sudo apt-get install libgtest-dev libgmock-dev googletest

这包括 gmock。

对于基于@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/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM