CMake实践:引入三方库gtest
软件名称 | 软件版本 |
---|---|
Linux操作系统 | Ubuntu 22.04 LTS(X64) |
cmake | 3.22.1 |
很多时候,我们需要在工程中引入第三方库,例如加解密、证书、tls等功能的openssl库。本文以C++开源测试框架库gtest为例介绍如何将该库引入到我们的工程中,并写一个简单的用例来验证。有两种方式将其引入到我们的工程中,一种是将gtest的源码直接与本地工程一起编译构建,一种是将gtest编译成链接库,本地工程引用该库。
在介绍上述两种方式之前,需要先下载gtest的源码,下载方式git clone https://github.com/google/googletest.git
。
通过源码方式引入
将下载的gtest源码放置到example/gtest/下,工程目录结构为:
example
├── CMakeLists.txt
├── gtest
├── test.cpp
CMakeLists.txt文件内容如下:
CMAKE_MINIMUM_REQUIRED(VERSION 3.22)
PROJECT(example)
ADD_SUBDIRECTORY(gtest) # 新增gtest构建
ADD_EXECUTABLE(test test.cpp)
TARGET_LINK_LIBRARIES(test gtest)
test.cpp文件主要内容为:编写一个测试用例,在main函数中初始化gtest框架并运行所有的用例,文件内容如下:
#include "gtest/gtest.h"
TEST(FirstTest, testcase1)
{
ASSERT_EQ(1, 1);
}
int main(int argc, char** argv)
{
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
使用cmake .
和make
命令之后,就会构建出可执行文件test,运行./test
结果如下:
$ ./test
[==========] Running 1 test from 1 test suite.
[----------] Global test environment set-up.
[----------] 1 test from FirstTest
[ RUN ] FirstTest.testcase1
[ OK ] FirstTest.testcase1 (0 ms)
[----------] 1 test from FirstTest (0 ms total)
[----------] Global test environment tear-down
[==========] 1 test from 1 test suite ran. (0 ms total)
[ PASSED ] 1 test.
可见已经成功将gtest引入,通过源码引入的方式好处就是它跟本地工程代码一起编译,出现兼容性问题的可能性很小。
通过链接库的方式引入
使用链接库的方式,需要将源码编译成链接库安装到本地系统,并通过一定方式找到链接库进行引用。
在本地系统编译gtest
依次执行如下命令编译和安装库:
git clone https://github.com/google/googletest.git
cd googletest
mkdir build
cd build
cmake -DCMAKE_INSTALL_PREFIX=/home/gtest ..
make
sudo make install
如果没有错误,会在/home/gtest目录下安装include和lib两个文件,即gtest要用到的头文件和库文件。
在CMake中使用安装的gtest库
CMake中可以通过find_package来查找系统中已经安装的库,具体可以参考find_package简介,我们没有把gtest安装在默认的系统目录,因此还需要指定查找目录,对于本文,搜索路径应该是/home/gtest/lib/cmake/GTest。
CMakeLists.txt文件内容:
CMAKE_MINIMUM_REQUIRED(VERSION 3.22)
PROJECT(example)
FIND_PACKAGE(GTest
CONFIG REQUIRED
PATHS /home/gtest/lib/cmake/GTest)
if (GTest_FOUND)
ADD_EXECUTABLE(test test.cpp)
TARGET_LINK_LIBRARIES(test GTest::gtest)
endif()
test.cpp文件内容:
#include "gtest/gtest.h"
TEST(FirstTest, testcase1)
{
ASSERT_EQ(1, 1);
}
int main(int argc, char** argv)
{
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
使用cmake .
和make
命令之后,就会构建出可执行文件test,运行./test
呈现结果与上小节一致。