The article was initially posted on 2016-08-19.
问题
今天在云日卓的云桌面(Ubuntu系统)上开始实训,接触到了 Google Test 这种测试框架。然而看了教程,对于如何搭建测试环境,即如何把充满 TEST 、 EXPECT_EQ 的测试文件 test.cpp 编译并投入使用,我还是一脸懵逼。教程们主要针对怎么写 test.cpp ,这显然高估了我的测试环境搭建能力。好在经过一阵摸索,我也找到了编译的办法
解压
先从官方那下载 gtest-1.6.0
然后解压


把生成的文件夹 Ctrl+C 、Ctrl+V 复制粘贴到找得到的地方。这里我复制到了 test 目录下

生成可被链接的文件
打开复制得到的 gtest-1.6.0 ,找到 make 文件夹。通过终端进入这个 make 文件夹
方法是同时按下 Ctrl+Alt+T 打开终端,输入 cd 加空格,然后把 make 文件夹左键拖动到终端并放开,回车


然后敲入 make ,等待它编译好

结果编译错误…

嘛不要紧,亲自到 make 目录看看
只要有 gtest_main.o 、 gtest_all.o 、 gtest_main.a 这三个文件在,就可以继续了
把 gtest_main.a 重命名为 libgtest.a ,准备完毕


编译测试文件
在这里我准备好了 Date.hpp 和 Date.cpp 供测试

以及一份简单的 test.cpp

相关的目录结构为
test
├── date
│ ├── Date.hpp
│ ├── Date.cpp
│ └── test.cpp
│
└── gtest-1.6.0
├── include
└── make
├── gtest_main.o
├── gtest_all.o
└── libgtest.a
在这种目录结构下,编译命令为
g++ Date.cpp test.cpp -I ../gtest-1.6.0/include -L ../gtest-1.6.0/make -lgtest -lpthread -o test
g++ Date.cpp test.cpp把这两份文件编译为可执行文件../指的是date的上级目录test,例如../gtest-1.6.0/include就是/test/gtest-1.6.0/include的意思-I ../gtest-1.6.0/include提供#include的备选目录。在test.cpp中有#include "gtest/gtest.h"一句,其中gtest/gtest.h就在../gtest-1.6.0/include下。没有该参数,编译器就不会去/test/gtest-1.6.0/include下头文件,结果找不到gtest.h而报错-L ../gtest-1.6.0/make提供链接库.a文件的备选目录。有了这个参数,处理-lgtest时才找的到对应的链接库libgtest.a-lpthread和线程有关的库。Google Test 运行中有用到相关函数,所以要链接上-o test设置输出文件的名字为test

大功告成!运行下试试
./test

本质上,就是在编译过程中要链接好 libgtest.a 这个库(和线程那个库)。这个库实际上是由 gtest_all.o 和 gtest_main.o 组成。因此我们也可以不要链接 libgtest.a,而是按熟悉的 g++ 输入文件 -o 输出文件名 的方式
g++ Date.cpp test.cpp ../gtest-1.6.0/make/gtest_all.o ../gtest-1.6.0/make/gtest_main.o -I ../gtest-1.6.0/include -lpthread -o test
上面这段只是把输入文件变成了 Date.cpp 、 test.cpp 、 ../gtest-1.6.0/make/gtest_all.o 和 ../gtest-1.6.0/make/gtest_main.o
即编译 Date.cpp 和 test.cpp ,链接 ../gtest-1.6.0/make/gtest_all.o 和 ../gtest-1.6.0/make/gtest_main.o,其他不变,效果拔群