Googletest (gtest)似乎是一个非常流行的单元测试框架,我想学习如何在g++编译器上独立构建它,简单方便,这样我就可以用它测试小型库和一次性文件。
我已经在这里阅读了官方文档和自述:
- https://github.com/google/googletest
- 和这里: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.
- For
googletest/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 )
- 对于
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
指出- Q:为什么在构建googletest库时需要包含dir
-I"googletest/googletest"
?- 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"
标记它作为包含目录。
- A:因为
- 你也可以用gtest测试C代码,在c++中包含C头文件时使用
extern "C" { }
技巧来防止名称混淆。然后链接到C构建的对象*.o
文件,同时在c++ googletest单元测试中包含未命名的头文件。
建筑快乐!现在我/我们终于可以在我们自己的个人项目中轻松地使用gtest了!
其他引用:
- 我自己的答案,我想出了
time
cmd包装器的东西时间子组件的一个更大的多行命令,以及整个多行命令:如何在多个命令上运行时间和写时间输出到文件?
关于更手动的方法,请参阅我在这里的其他答案。
"easy"方法:在/usr/local/include
和/usr/local/lib
中分别安装gtest的头文件和.a静态库文件。
我又花了一年的努力,总共花了大约5年的时间来学习如何做到这一点,我终于找到了"容易"的方法。方式。
我最初只是想知道运行什么g++
命令来构建我自己的单元测试文件。下面是答案:
-
在
/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/.
-
使用
-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")标志的含义