CMake实践:引入三方库gtest

2023-09-19  本文已影响0人  Domibaba
软件名称 软件版本
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呈现结果与上小节一致。

上一篇 下一篇

猜你喜欢

热点阅读