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

在...创建的问题 Tue, Dec 15, 2015 12:00 AM

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

    
80
  1. 很高兴您分享您的知识和经验,感谢您的贡献。但是,这是一个QA网站,所以请将您的问题短语作为一个问题,而不是作为一个咆哮。
    2012-11-22 13:56:28Z
  2. BTW,gtest版本使用autotools进行管理,因此标准./configure && make && make install工作流程应该可以正常工作。我不确定这是否保证一个帖子,因为它与从源代码编译许多其他软件包没什么不同。
    2012-11-22 14:01:46Z
  3. 我想并非所有用户都像你一样有经验。我最近从Windows到Linux,我很乐意在StackOverflow上找到类似的东西。
    2012-11-24 18:06:03Z
  4. 请注意,Google建议您不要构建库,而是将GTest代码包含在项目中。请参阅 code.google.com/p/googletest/wiki/...一>
    2015-08-14 14:19:52Z
  5. @Mawg提供的链接被破坏(维基被删除),它似乎工作但指向不再是主题的页面(相当令人困惑) 。我可以找到的最好的替代品是这些构建说明: github.com /google/googletest/blob/master/googletest/README.md 但这只解释了如何使用cmake构建。对于autotools,我发现以下答案最有效: stackoverflow.com/a/36000856/1487069
    2019-02-23 11:33:05Z
  6. 醇>
    11答案                              11 跨度>                         

    在开始之前,请确保您已阅读并理解 来自Google的这条说明!本教程简单易用gtest,但可能会介绍令人讨厌的错误

    1。获取googletest框架

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

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

    2。解压缩并构建谷歌测试

     
    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 include/gtest /usr/include
    $ sudo cp -a libgtest_main.so libgtest.so /usr/lib/
    

    4。更新链接器的缓存

    ...并检查GNU Linker是否知道libs

     
    $ 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标记。

    从这里你可能想去谷歌文档,了解有关框架以了解其工作原理。快乐编码!

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

        
    131
    2017-07-07 22:54:30Z
    1. 是否没有make install目标可以使用而不是手动复制库和标题?
      2012-11-22 13:57:51Z
    2. 引用makefile的输出:'make install' is dangerous and not supported. Instead, see README for how to integrate Google Test into your build system.
      2012-11-22 14:08:24Z
    3. 谢谢。我的立场得到了纠正。
      2012-11-22 14:10:08Z
    4. 非常感谢ManuelSchneid3r !!!效果很好!!但是缺少gmock。
      2014-12-17 14:40:01Z
    5. 2015-02-02 10:06:25Z
    6. 醇>

    我花了一段时间才弄明白,因为正常的“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 
    
        
    25
    2014-07-15 22:13:21Z
    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
      2015-06-11 16:08:22Z
    2. 感谢验证示例
      2016-09-09 06:28:45Z
    3. 醇>

    让我专门为ubuntu用户回答这个问题。 首先安装gtest开发包。

     
    sudo apt-get install libgtest-dev
    

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

     
    sudo apt-get install cmake # install cmake
    cd /usr/src/gtest
    sudo cmake CMakeLists.txt
    sudo make
    
    # copy or symlink libgtest.a and libgtest_main.a to your /usr/lib folder
    sudo cp *.a /usr/lib
    

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

     
    -lgtest -lgtest_main
    

    这对我来说非常适合Ubuntu 14.04LTS。

        
    25
    2017-01-31 09:43:34Z
    1. 实际上你不必手动复制库,在Makefile中有一个目标。你可以这样做:sudo apt-get install cmake #install cmake cd /usr /src /gtest sudo cmake CMakeLists.txt sudo make install应该构建并复制/usr /local /lib /
      2017-10-20 18:51:01Z
    2. @ AlexanderZinovyev我得到“make:***没有规则让目标'安装'。停止。”当我执行“sudo make install”
      2018-03-28 15:33:00Z
    3. “sudo make install”在Ubuntu 18.04上运行,但在Ubuntu 16.04上无效。
      2018-08-10 17:57:27Z
    4. @ AhmedNassar:“sudo make install”与“sudo cp * .a /usr /lib”完全相同。因此,如果生成的Makefile中没有安装选项,则只需手动复制它们
      2018-08-16 11:17:26Z
    5. 像魅力一样工作。谢谢!
      2018-11-07 09:07:40Z
    6. 醇>

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

    这可以避免您必须将gtest源代码保存在存储库中,或者将其安装在任何位置。它会自动下载并构建在构建树中。

        
    8
    2017-05-23 12:34:44Z

    我同样对这种情况感到不知所措,最终为此创建了自己的Ubuntu源代码包。这些源包允许您轻松生成二进制包。它们基于最新的gtest&amp;这个帖子的gmock来源。

    Google Test DEB Source Package

    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 ) 这似乎是一个普遍的问题。

        
    1
    2015-03-29 01:22:55Z
    1. 当我尝试编译时,你的包给了我错误。有什么理由??这是我的日志test.cpp :(。text + 0x57):未定义引用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):未定义引用`testing :: internal :: AssertHelper :: operator =(testing :: Message const&amp;)const'...它太长了以至于我无法发布整个事物。我在一个全新的Ubuntu 14.04虚拟机中完成了这项工作,因此除了必要的依赖项之外没有安装任何其他内容。
      2015-03-28 19:51:05Z
    2. @ ddelnano是的,我也遇到了这个小谷歌测试宝石。显然,共享库的顺序很重要。将gtest链接到单元测试时,请尝试在其他库之前包含gtest。当我遇到这个问题时,这个链接为我解决了这个问题: bbs.archlinux.org/viewtopic .PHP?ID = 156639
      2015-03-29 01:18:51Z
    3. @ ddelnano,如果您的测试套件没有定义'main',那么不要忘记链接'gtest_main'。
      2015-03-29 01:32:57Z
    4. 我没有包含任何其他库。这就是我在#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(); }
      文件中的全部内容
      2015-03-29 15:11:55Z
    5. nevermind我在发布评论之前没有看过博文。它现在终于工作了!
      2015-03-29 16:59:45Z
    6. 醇>

    以防其他人昨天(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
    2016-06-23 14:30:09Z

    askubuntu的回答对我有用。看起来比其他选项更简单,更不容易出错,因为它使用包libgtest-dev从那里获取源代码和构建: https://askubuntu.com/questions/145887/why-no-library-files-installed-for-google-test?answertab=votes#tab机顶

    请参考该答案,但作为一种捷径我也提供了以下步骤:

     
    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
    2017-04-13 12:22:42Z

    这将在基于Ubuntu /Debian的系统中安装google test和mock库:

     
    sudo apt-get install google-mock
    

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

        
    0
    2016-11-11 22:42:59Z
    1. 嗯,不,我认为这只安装googlemock,但它没有安装googletest(gtest)。至少那是发生在我身上的事。
      2016-12-24 06:52:05Z
    2. 醇>

    这将构建并安装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
    
        
    0
    2017-01-04 10:50:45Z

    以下方法可避免手动处理/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)
    
        
    0
    2019-06-28 06:37:41Z

    基于@ 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/
    
        
    - 1
    2019-02-22 14:58:44Z
    1. 我写了这个答案已经有一段时间了,如果你觉得它没有价值/无效,请告诉我它有什么问题。
      2019-04-30 15:13:04Z
    2. 醇>
来源放置 这里