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

2024-10-22 08:29:00
admin
原创
64
摘要:问题描述:Debian 不再为 gTest 提供任何预编译包。他们建议您将框架集成到项目的 makefile 中。但我想保持 makefile 干净。如何像以前的版本(<1.6.0)一样设置 gTest,以便我可以链接到库?解决方案 1:开始之前,请确保您已阅读并理解了Google 的此说明!本教程使使...

问题描述:

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


解决方案 1:

开始之前,请确保您已阅读并理解了
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
  1. 在您的系统上“安装”标题和库。


此步骤可能因发行版而异,因此请确保将标头和库复制到正确的目录中。我通过检查Debian 以前的 gtest 库的位置来完成此操作。但我确信有更好的方法来做到这一点。

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

# The easiest/best way:
make install  # Note: before v1.11 this can be dangerous and is not supported

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链接器标志将您的项目链接到库,如果您没有编写自己的测试main()例程,也可以选择设置显式-lgtest_main标志。

从现在开始,您可能想要查看 Google 的Googletest Primer文档以及有关该框架的旧文档,以了解其工作原理。祝您编码愉快!

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

解决方案 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 上运行良好。

解决方案 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&quot;Unix Makefiles&quot; ..
$ make
$ cp -r ../include/gtest ~/usr/gtest/include/
$ cp lib*.so ~/usr/gtest/lib

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

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

    int main(int argc, char **argv) {
        ::testing::InitGoogleTest( &amp;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 

解决方案 4:

如果您恰好使用 CMake,则可以按照此处ExternalProject_Add所述使用。

这样就无需将 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(或者-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 测试 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)这似乎是一个常见的陷阱。

解决方案 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:

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

解决方案 10:

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

解决方案 11:

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

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

这包括 gmock。

解决方案 12:

通过查看@ManuelSchneid3r 此处和@amritkrs 此处的出色解答,我终于能够(经过超过一年的努力)整理出一套更为最新的说明,以及其他任何此处解答未提供的额外见解和信息,而这也是我五年来一直在努力弄清楚的。

这包括大量关于 gcc/g++ 库、安装库、命名 .a 静态链接库文件、g++ 搜索包含的内容等。

如何在 Linux/Unix 上将 Google Test ( gtest) 和 Google Mock ( ) 安装为系统范围内的gmock共享静态库.a

在 Ubuntu 20.04 上使用最新(未发布、git pulled)版本的googletest(比 v1.13.0 更新)进行了测试。

如果很着急,只需运行安装部分中的几个命令,然后查看随后的“示例用法”。

注意:googletest 在过去几年经历了各种变化。例如,gtest 和 gmock 现在打包在同一个 repo 下,此处:https ://github.com/google/googletest 。因此,按照我的说明将为您安装这两个。

1.从源代码安装最新的 gtest 和 gmock

如果您想要最新发布的版本,请在这里找到:https://github.com/google/googletest/releases

你可以wget像这样下载它,例如:

# Download release v1.13.0
wget https://github.com/google/googletest/archive/refs/tags/v1.13.0.tar.gz

不过,我更喜欢从仓库本身获取最新的内容。以下是我的完整说明,具体如下:

sudo apt update
sudo apt install cmake

# You can find some of these instructions, here: 
# https://github.com/google/googletest/tree/main/googletest
time git clone https://github.com/google/googletest.git
cd googletest        # &quot;Main directory of the cloned repository.&quot;
mkdir build          # &quot;Create a directory to hold the build output.&quot;
cd build
time cmake ..        # &quot;Generate native make build scripts for GoogleTest.&quot;
                        # Takes ~2 seconds.
time make            # Run those makefiles just autogenerated by cmake above.
                        # Takes ~10 seconds.
sudo make install    # Install the .a library files, and headers, into 
                        # /user/local/.

完毕!

您现在可以将必要的标题包含到您的文件中,如上所示。

/usr/local注意:这是运行时复制或“安装”的内容的完整输出sudo make install

googletest/build$ sudo make install
[ 25%] Built target gtest
[ 50%] Built target gmock
[ 75%] Built target gmock_main
[100%] Built target gtest_main
Install the project...
-- Install configuration: &quot;&quot;
-- Up-to-date: /usr/local/include
-- Installing: /usr/local/include/gmock
-- Installing: /usr/local/include/gmock/gmock.h
-- Installing: /usr/local/include/gmock/gmock-actions.h
-- Installing: /usr/local/include/gmock/gmock-more-matchers.h
-- Installing: /usr/local/include/gmock/gmock-spec-builders.h
-- Installing: /usr/local/include/gmock/gmock-function-mocker.h
-- Installing: /usr/local/include/gmock/internal
-- Installing: /usr/local/include/gmock/internal/gmock-pp.h
-- Installing: /usr/local/include/gmock/internal/gmock-internal-utils.h
-- Installing: /usr/local/include/gmock/internal/gmock-port.h
-- Installing: /usr/local/include/gmock/internal/custom
-- Installing: /usr/local/include/gmock/internal/custom/gmock-port.h
-- Installing: /usr/local/include/gmock/internal/custom/gmock-matchers.h
-- Installing: /usr/local/include/gmock/internal/custom/gmock-generated-actions.h
-- Installing: /usr/local/include/gmock/internal/custom/README.md
-- Installing: /usr/local/include/gmock/gmock-cardinalities.h
-- Installing: /usr/local/include/gmock/gmock-more-actions.h
-- Installing: /usr/local/include/gmock/gmock-matchers.h
-- Installing: /usr/local/include/gmock/gmock-nice-strict.h
-- Installing: /usr/local/lib/libgmock.a
-- Installing: /usr/local/lib/libgmock_main.a
-- Installing: /usr/local/lib/pkgconfig/gmock.pc
-- Installing: /usr/local/lib/pkgconfig/gmock_main.pc
-- Installing: /usr/local/lib/cmake/GTest/GTestTargets.cmake
-- Installing: /usr/local/lib/cmake/GTest/GTestTargets-noconfig.cmake
-- Installing: /usr/local/lib/cmake/GTest/GTestConfigVersion.cmake
-- Installing: /usr/local/lib/cmake/GTest/GTestConfig.cmake
-- Up-to-date: /usr/local/include
-- Installing: /usr/local/include/gtest
-- Installing: /usr/local/include/gtest/gtest-param-test.h
-- Installing: /usr/local/include/gtest/gtest-printers.h
-- Installing: /usr/local/include/gtest/gtest-test-part.h
-- Installing: /usr/local/include/gtest/internal
-- Installing: /usr/local/include/gtest/internal/gtest-port.h
-- Installing: /usr/local/include/gtest/internal/gtest-death-test-internal.h
-- Installing: /usr/local/include/gtest/internal/gtest-filepath.h
-- Installing: /usr/local/include/gtest/internal/custom
-- Installing: /usr/local/include/gtest/internal/custom/gtest-printers.h
-- Installing: /usr/local/include/gtest/internal/custom/gtest-port.h
-- Installing: /usr/local/include/gtest/internal/custom/gtest.h
-- Installing: /usr/local/include/gtest/internal/custom/README.md
-- Installing: /usr/local/include/gtest/internal/gtest-string.h
-- Installing: /usr/local/include/gtest/internal/gtest-type-util.h
-- Installing: /usr/local/include/gtest/internal/gtest-param-util.h
-- Installing: /usr/local/include/gtest/internal/gtest-port-arch.h
-- Installing: /usr/local/include/gtest/internal/gtest-internal.h
-- Installing: /usr/local/include/gtest/gtest_pred_impl.h
-- Installing: /usr/local/include/gtest/gtest-assertion-result.h
-- Installing: /usr/local/include/gtest/gtest-typed-test.h
-- Installing: /usr/local/include/gtest/gtest-spi.h
-- Installing: /usr/local/include/gtest/gtest_prod.h
-- Installing: /usr/local/include/gtest/gtest.h
-- Installing: /usr/local/include/gtest/gtest-message.h
-- Installing: /usr/local/include/gtest/gtest-death-test.h
-- Installing: /usr/local/include/gtest/gtest-matchers.h
-- Installing: /usr/local/lib/libgtest.a
-- Installing: /usr/local/lib/libgtest_main.a
-- Installing: /usr/local/lib/pkgconfig/gtest.pc
-- Installing: /usr/local/lib/pkgconfig/gtest_main.pc

2.背景:上面的安装说明刚刚有:

  1. 安装 gtest 和 gmock*.a静态库文件,以便您可以使用这些简单的构建标志(由链接器使用)/usr/local/lib构建和运行 gtest 和 gmock 程序:g++`ld`

1. `-lgtest`
链接`/usr/local/lib/libgtest.a`静态库文件,它提供一般的 googletest 功能。
2. `-lgtest_main`
链接静态库文件,该文件提供了googletest所需的`/usr/local/lib/libgtest_main.a`默认函数。`main()`
3. `-lgmock`
链接`/usr/local/lib/libgmock.a`静态库文件,提供一般的 googlemock 功能。
4. `-lgmock_main`
链接静态库文件,该文件提供了googlemock所需的`/usr/local/lib/libgmock_main.a`默认函数。`main()`
5. `-pthread`
googletest 需要它,因为它在底层使用 POSIX 线程。*笔记:*
1. 顺序很重要。确保上面的标志位于需要它们的文件*之后。*
2. 如果您要设置必要的 CMake 定义以构建共享动态链接 .so 库而不是我们正在构建的静态 .a 库,则`-l`上述标志将导致运行时链接器在运行时链接这些库。有关更多信息,请参阅@amritkrs 的回答`-l`。但是,按照我的说明,将导致这些相同的标志在构建时链接,将整个预构建的 .a 静态库文件二进制文件放入您的可执行文件中。
  1. 将您需要包含在程序中的所有 gtest 和 gmock 头文件分别安装到/usr/local/include/gtest和中/usr/local/include/gmock

这使您可以在程序中包含必要的文件,如下所示:

// Include in your unit tests
#include &lt;gtest/gtest.h>
#include &lt;gmock/gmock.h>

// Include in your production code to give gtest access to private members
// in your classes, as friends, via the 
// `FRIEND_TEST(TestSuiteName, TestName);` macro, for instance.
#include &lt;gtest/gtest_prod.h>

3.使用示例:

# Build and run an example googletest unit test that comes in the repo:
# - required in this case: `-pthread`, `-lgtest`, and `-lgtest_main`

mkdir -p bin

time g++ -Wall -Wextra -Werror -O3 -std=c++17 -pthread \n    googletest/googletest/samples/sample1_unittest.cc \n    googletest/googletest/samples/sample1.cc \n    -lgtest -lgtest_main -o bin/a &amp;&amp; time bin/a

4. 运行示例单元测试

手动测试构建并运行 repo 中包含的示例测试:

# (run while still in the googletest/build dir)
time g++ -Wall -Wextra -Werror -O3 -std=c++17 -pthread \n    ../googletest/samples/sample1_unittest.cc \n    ../googletest/samples/sample1.cc \n    -lgtest -lgtest_main -o bin/a &amp;&amp; time bin/a

示例运行和输出:

googletest/build$ time g++ -Wall -Wextra -Werror -O3 -std=c++17 -pthread \n>     ../googletest/samples/sample1_unittest.cc \n>     ../googletest/samples/sample1.cc \n>     -lgtest -lgtest_main -o bin/a &amp;&amp; time bin/a

real    0m1.879s
user    0m1.740s
sys 0m0.135s
Running main() from /home/gabriel/GS/dev/temp/googletest/googletest/src/gtest_main.cc
[==========] Running 6 tests from 2 test suites.
[----------] Global test environment set-up.
[----------] 3 tests from FactorialTest
[ RUN      ] FactorialTest.Negative
[       OK ] FactorialTest.Negative (0 ms)
[ RUN      ] FactorialTest.Zero
[       OK ] FactorialTest.Zero (0 ms)
[ RUN      ] FactorialTest.Positive
[       OK ] FactorialTest.Positive (0 ms)
[----------] 3 tests from FactorialTest (0 ms total)

[----------] 3 tests from IsPrimeTest
[ RUN      ] IsPrimeTest.Negative
[       OK ] IsPrimeTest.Negative (0 ms)
[ RUN      ] IsPrimeTest.Trivial
[       OK ] IsPrimeTest.Trivial (0 ms)
[ RUN      ] IsPrimeTest.Positive
[       OK ] IsPrimeTest.Positive (0 ms)
[----------] 3 tests from IsPrimeTest (0 ms total)

[----------] Global test environment tear-down
[==========] 6 tests from 2 test suites ran. (0 ms total)
[  PASSED  ] 6 tests.

real    0m0.003s
user    0m0.000s
sys 0m0.002s

5. 卸载

要删除/卸载 gtest 和 gmock,只需手动删除所有通过 复制的文件即可sudo make install。执行此操作的命令如下:

# remove the main libraries
sudo rm /usr/local/lib/libgtest.a \n        /usr/local/lib/libgtest_main.a \n        /usr/local/lib/libgmock.a \n        /usr/local/lib/libgmock_main.a

# remove the include dirs
sudo rm -r /usr/local/include/gtest \n           /usr/local/include/gmock

# extras

# remove the package config (whatever that is)
sudo rm /usr/local/lib/pkgconfig/gtest.pc \n        /usr/local/lib/pkgconfig/gtest_main.pc \n        /usr/local/lib/pkgconfig/gmock.pc \n        /usr/local/lib/pkgconfig/gmock_main.pc

# remove cmake GTest stuff
sudo rm -r /usr/local/lib/cmake/GTest

进一步了解:有关库的一般信息;调试;gcc/g++ 编译器标志;等等。

  1. 编译时,g++搜索包含目录以查找代码包含的所有头文件。可以通过运行$(gcc -print-prog-name=cc1plus) -v并在一秒钟后按 Ctrl + C 来终止它来找到默认的 C++ 系统范围包含路径(请参阅此处:gcc 在哪里查找 C 和 C++ 头文件?)。它们主要包括:

/usr/include        # system-added includes
/usr/local/include  # user-added includes

# as well as some more include paths to pull in compiler includes

g++包含目录还包括您通过标志传递的任何目录-I,例如-I&quot;path/to/some/personal/include_dir1&quot; -I&quot;path/to/include_dir2&quot;等。

直接存储 gtest 的包含内容/usr/local/include意味着您无需传递自定义-I标志来指定它们的位置。编译器现在始终可以使用它们!

  1. 与上面的“包含”概念类似,可以通过将库文件(例如静态链接的 .a 文件(或动态链接的 .so 文件))作为输入传递给 来链接到您的可执行文件g++

示例:根据我在此处的回答,此命令手动指定gtestgmock包含目录以及预构建的 .a 文件,并构建googletest/googletest/samples/sample1_unittest.cc示例程序:

# Note: the specified .a files here must actually be locally stored in
# a local &quot;bin&quot; path, as specified in this command
time ( \n    time g++ -Wall -Wextra -Werror -O3 -std=c++17 -pthread \n    -I&quot;googletest/googletest/include&quot; -I&quot;googletest/googlemock/include&quot; \n    googletest/googletest/samples/sample1_unittest.cc \n    googletest/googletest/samples/sample1.cc \n    bin/libgtest.a bin/libgtest_main.a \n    -o bin/a \n    &amp;&amp; time bin/a \n)

或者,通过将包含文件复制到/usr/local/include并将 .a 静态库文件复制到/usr/local/lib,您可以大大简化该命令并运行此命令!不再需要指定包含目录,并且您无需传递path/to/libgtest.a和,只需分别传递和即可:path/to/libgtest_main.a`-lgtest`-lgtest_main

time g++ -Wall -Wextra -Werror -O3 -std=c++17 -pthread \n    googletest/googletest/samples/sample1_unittest.cc \n    googletest/googletest/samples/sample1.cc \n    -lgtest -lgtest_main -o bin/a &amp;&amp; time bin/a
  1. 您不需要运行sudo make install来分别安装 gtest 和 gmock 标头和库到/usr/local/include和 中/usr/local/lib,而是可以通过复制这些标头文件和库来手动安装它们,如下所示:

# manually install the .a libraries, and header files

# give access to g++ flags `-lgtest`, `-lgtest_main`, `-lgmock`, and
# `-lgmock_main`, by copying over the .a static library files
sudo cp -i -t /usr/local/lib \n    lib/libgtest.a lib/libgtest_main.a lib/libgmock.a lib/libgmock_main.a
# give access to include header files `&lt;gtest/gmock.h>` `&lt;gtest/gtest.h>`, 
# `&lt;gtest/gtest_prod.h>`, etc.
# 1. gtest header file includes
sudo cp -a path/to/googletest/googletest/include/gtest /usr/local/include
# 2. gmock header file includes
sudo cp -a path/to/googletest/googlemock/include/gmock /usr/local/include 

我第一次在 @ManuelSchneid3r 的回答中了解到这个概念。我自己测试了一下。

  1. 如果没有安装头文件或未-I指定头文件的路径,您将无法包含所需的头文件,例如fatal error: gtest/gtest.h: No such file or directory这里:

eRCaGuy_hello_world/cpp$ time g++ -Wall -Wextra -Werror -O3 -std=c++17 -pthread  googletest/googletest/samples/sample1_unittest.cc     googletest/googletest/samples/sample1.cc     -lgtest -lgtest_main     -o bin/a      &amp;&amp; time bin/a
googletest/googletest/samples/sample1_unittest.cc:46:10: fatal error: gtest/gtest.h: No such file or directory
   46 | #include &quot;gtest/gtest.h&quot;
      |          ^~~~~~~~~~~~~~~
compilation terminated.

real    0m0.046s
user    0m0.039s
sys 0m0.007s
  1. 如果没有安装库(.a 或 .so 文件),并且您尝试使用-lgtest例如而不是path/to/libgtest.a直接传递,您将看到通过链接器链接失败ld,例如cannot find -lgtest这里:

eRCaGuy_hello_world/cpp$ time g++ -Wall -Wextra -Werror -O3 -std=c++17 -pthread  googletest/googletest/samples/sample1_unittest.cc     googletest/googletest/samples/sample1.cc     -lgtest -lgtest_main     -o bin/a      &amp;&amp; time bin/a
/usr/bin/ld: cannot find -lgtest
/usr/bin/ld: cannot find -lgtest_main
collect2: error: ld returned 1 exit status

real    0m1.895s
user    0m1.776s
sys 0m0.119s
  1. 如果将库文件复制到已知的g++系统范围库路径,例如/usr/local/lib(建议用于用户安装的 .a 和 .so 库)或(用于系统安装的 .a 和 .so 库),则必须/usr/lib.a 文件命名为 ,例如,才能用作。libwhatever.a`-lwhatever`

您不能呼叫他们lwhatever.alibwhatever必须给他们命名libwhatever.a

因此,虽然文件/usr/local/lib/libgtest.a可以启用-lgtest库链接器标志,但实际上/usr/local/lib/lgtest.a却不能。

如果您的名称错误,然后尝试使用该-lgtest标志,您将看到/usr/bin/ld: cannot find -lgtest如上所示的链接器错误,因为该库没有正确命名和“安装”。

再次,这意味着如果您调用它/usr/local/lib/libwhatever.a,那么您必须使用它-lwhatever作为该库的链接器标志。

请注意,根据ld --help-l(小写“L”) 标志显然已传递给ld链接器,并且可能l代表library。请参阅我的问题:gcc/g++ 中 (小写“L”) 标志的含义-l。来自ld --help

-l LIBNAME, --library LIBNAME  
                            Search for library LIBNAME
  1. 查看/usr/local/lib和里面的库文件/usr/lib,库的链接器命名约定,无论是静态.a 还是动态.so 文件,似乎都要求库文件名必须以 ! 为前缀lib

  2. Gtest 在底层使用 POSIX 线程 (pthreads),因此您必须始终将-pthread标志传递给g++它。

  3. 谷歌搜索g++ &quot;-lpthread&quot; vs &quot;-pthread&quot;揭示了这个答案:编译时和之间的区别-pthread`-lpthread`-lpthread,其中说和之间的区别-pthread是历史性的,所以在今天的 gcc/g++ 和 clang 编译器上,你应该总是使用-pthread来引入 POSIX 线程。

-lpthread库现在显然是一个空的二进制文件,除了满足古老的要求(该库仍必须包含在某些地方)外,它什么也不做。但是,它-pthread会为您处理所有事情,因此只需-pthread单独使用即可!

差不多就这些了。我现在对 g++、库和 gtest 有了更多的了解。

参考:

  1. @ManuelSchneid3r 的回答

  2. @amritkrs 的回答

  3. https://github.com/google/googletest

    1. https://github.com/google/googletest/tree/main/googletest

  4. 我的问答:如何使用 gcc/g++ 或 clang 构建和使用 googletest (gtest) 和 googlemock (gmock)?

  5. 我的问题:gcc/g++ 中 (小写“L”) 标志的含义-l

解决方案 13:

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

sudo apt-get install google-mock

在基于 Debian 的图像中的 Google Cloud 中测试。

解决方案 14:

对于基于@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/
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用