我如何构建和使用googletest (gtest)和googlemock (gmock)与gcc/g++或clang?



Googletest (gtest)似乎是一个非常流行的单元测试框架,我想学习如何在g++编译器上独立构建它,简单方便,这样我就可以用它测试小型库和一次性文件。

我已经在这里阅读了官方文档和自述:

  1. https://github.com/google/googletest
  2. 和这里:https://github.com/google/googletest/tree/main/googletest

…但我还是想不明白。

我如何使用gcc/g++编译器或g++兼容的LLVM clang编译器构建和测试gtest ?


我知道我可以这样做来使用cmake,但是它并没有给我想要的粒度控制级别,而且它仍然没有回答"完成后如何使用这些。a静态库文件"这个神秘的问题。

: https://github.com/google/googletest/tree/main/googletest generic-build-instructions

git clone https://github.com/google/googletest.git
cd googletest        # Main directory of the cloned repository.
mkdir build          # Create a directory to hold the build output.
cd build
time cmake ..        # Generate native make build scripts for GoogleTest.
time make            # Run those makefiles just autogenerated by cmake above.

你现在有以下4个库文件与任何构建设置预先为你在cmake文件,但我仍然不知道如何使用它们:

googletest/build/lib/libgmock.a
googletest/build/lib/libgmock_main.a
googletest/build/lib/libgtest.a
googletest/build/lib/libgtest_main.a

一年后我的全新答案,请看这里:方法:在/usr/local/include/usr/local/lib中分别安装gtest的头文件和.a静态库文件。


"hard"方法:手动构建一切从头开始,使用g++直接与一个构建系统

我终于明白了!关键的参考资料是这个,其中有一些优秀的构建命令示例,我研究了这些示例来弄清楚:https://ethz-adrl.github.io/ct/ct_core/doc/html/md__home_adrl_code_src_control-toolbox_ct_core_build_test_googletest-src_googletest_README.html

步骤如下:

在Linux Ubuntu上测试。

我首先记录了整个过程,以及更多,在我的主c++自述文件中的eRCaGuy_hello_world repo中:cpp/readme .md.

1。将所有gtest和gmock构建为静态库存档*.a文件

# Clone the repo
git clone https://github.com/google/googletest.git
# Build all of gtest and gmock as static library archive `*.a` files
time g++ -Wall -Wextra -Werror -O3 -std=c++17 -pthread -c 
-I"googletest/googletest/include" -I"googletest/googletest" 
-I"googletest/googlemock/include" -I"googletest/googlemock" 
googletest/googletest/src/gtest-all.cc 
googletest/googletest/src/gtest_main.cc 
googletest/googlemock/src/gmock-all.cc 
googletest/googlemock/src/gmock_main.cc
# move all of the object files just created to a "bin" dir
mkdir -p bin
mv -t bin gtest-all.o gtest_main.o gmock-all.o gmock_main.o
# Use the `ar` "archive" utility to create the *.a static library archive files
# from the 4 object files above
time ar -rv bin/libgtest.a bin/gtest-all.o
time ar -rv bin/libgtest_main.a bin/gtest_main.o
time ar -rv bin/libgmock.a bin/gmock-all.o
time ar -rv bin/libgmock_main.a bin/gmock_main.o

你现在有:

bin/libgtest.a
bin/libgtest_main.a
bin/libgmock.a
bin/libgmock_main.a

2。构建并运行googletest

附带的一些示例在这里查看这些示例测试:https://github.com/google/googletest/tree/main/googletest/samples.

  1. Forgoogletest/googletest/samples/sample1_unittest.cc:
    time ( 
    time g++ -Wall -Wextra -Werror -O3 -std=c++17 -pthread 
    -I"googletest/googletest/include" -I"googletest/googlemock/include" 
    googletest/googletest/samples/sample1_unittest.cc 
    googletest/googletest/samples/sample1.cc 
    bin/libgtest.a bin/libgtest_main.a 
    -o bin/a 
    && time bin/a 
    )
    
  2. 对于googletest/googletest/samples/sample2_unittest.cc:
    time ( 
    time g++ -Wall -Wextra -Werror -O3 -std=c++17 -pthread 
    -I"googletest/googletest/include" -I"googletest/googlemock/include" 
    googletest/googletest/samples/sample2_unittest.cc 
    googletest/googletest/samples/sample2.cc 
    bin/libgtest.a bin/libgtest_main.a 
    -o bin/a 
    && time bin/a 
    )
    

等。

示例构建和运行构建sample1_unittest.cc的命令和输出:

eRCaGuy_hello_world/cpp$ time ( 
>     time g++ -Wall -Wextra -Werror -O3 -std=c++17 -pthread 
>     -I"googletest/googletest/include" -I"googletest/googlemock/include" 
>     googletest/googletest/samples/sample1_unittest.cc 
>     googletest/googletest/samples/sample1.cc 
>     bin/libgtest.a bin/libgtest_main.a 
>     -o bin/a 
>     && time bin/a 
> )
real    0m1.787s
user    0m1.375s
sys 0m0.165s
Running main() from 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
real    0m1.790s
user    0m1.375s
sys 0m0.166s
指出

  1. Q:为什么在构建googletest库时需要包含dir-I"googletest/googletest"?
    1. A:因为googletest/googletest/src/gtest-all.cc包含所有其他源文件作为src/name_of_file.cc,这里:https://github.com/google/googletest/blob/main/googletest/src/gtest-all.cc#L41-L49。这意味着包含src目录的父目录必须是一个"include文件夹"。父目录是googletest/googletest,所以我们用-I"googletest/googletest"标记它作为包含目录。
  2. 你也可以用gtest测试C代码,在c++中包含C头文件时使用extern "C" { }技巧来防止名称混淆。然后链接到C构建的对象*.o文件,同时在c++ googletest单元测试中包含未命名的头文件。

建筑快乐!现在我/我们终于可以在我们自己的个人项目中轻松地使用gtest了!

其他引用:

  1. 我自己的答案,我想出了timecmd包装器的东西时间子组件的一个更大的多行命令,以及整个多行命令:如何在多个命令上运行时间和写时间输出到文件?

关于更手动的方法,请参阅我在这里的其他答案

"easy"方法:在/usr/local/include/usr/local/lib中分别安装gtest的头文件和.a静态库文件。

我又花了一年的努力,总共花了大约5年的时间来学习如何做到这一点,我终于找到了"容易"的方法。方式。

我最初只是想知道运行什么g++命令来构建我自己的单元测试文件。下面是答案:

  1. /usr/local/lib/中将gtest和gmock安装为静态的、.a共享库。此外,将它们的头文件安装到系统范围的/usr/local/include/中。

    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        # "Main directory of the cloned repository."
    mkdir build          # "Create a directory to hold the build output."
    cd build
    time cmake ..        # "Generate native make build scripts for GoogleTest."
    # 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/.
    
  2. 使用-pthread,-lgtest,-lgtest_main,-lgmock-lgmock_main链接标志,必要时直接传递给g++

    的例子:

    # 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 
    googletest/googletest/samples/sample1_unittest.cc 
    googletest/googletest/samples/sample1.cc 
    -lgtest -lgtest_main -o bin/a && time bin/a
    

For aton更多的细节,更长的解释和更多的信息。,在这里看到我的完整答案:如何将Google Test (gtest)和Google Mock (gmock)安装为共享的、静态的.a库,在Linux/Unix上!

有关-l标志的更多信息,请参阅我在这里的另一个答案:gcc/g++中-l(小写"L")标志的含义

相关内容

  • 没有找到相关文章

最新更新