Ubuntu18.04环境下Gtest框架安装测试

2023-11-18

准备

在安装Gtest框架之前在linux上安装好cmke、g++工具。
sudo apt-get install cmake
sudo apt-get install g++

方法一:下载Gtest压缩包解压安装

最新版本的Gtest下载链接:https://github.com/google/googletest
可以选择自己下载解压安装,下载的安装包为.ZIP文件时,下载unzip工具进行解压。

sudo apt-get install unzip
unzip googlegtest-xxx.zip

也可以创建一个文件夹使用命令行自动打包下载,一般习惯创建一个新的文件夹作为下载目录。

cd /
mkdir ./workspace
cd workspace
git clone https://github.com/google/googletest

下载之后进入googletest文件夹,新建一个文件夹build用于存放相关make操作会生成的文件和静态库。

cd googlegtest-xxx
mkdir build
cd build
cmake ..
make
sudo make install

安装完成之后,查看/usr/local/lib路径下是否存在libgtest.a和libgtest_main.a文件,可以手动copy。

cp /workspace/googlegtest-xxx/build/lib/libgtest*.a /usr/local/lib

对安装好的gtest框架进行测试。
新建一个文件夹用于存放gtest测试源码

mkdir /workspace/test_unit && cd /workspace/build
vim gtest.cpp

使用vim编辑器之前需要安装vim,sudo apt-get install vim

测试样例gtest.cpp:

#include <gtest/gtest.h>

int add (int a ,int b)
{
    return a+b;
}

TEST(Operations,ADD)
{
    EXPECT_EQ(6,add(2,4));
    EXPECT_EQ(8,add(3,5));
    EXPECT_EQ(17,add(9,9));
    EXPECT_EQ(0,add(1,1));
}

int main(int argc,char **argv){
  testing::InitGoogleTest(&argc,argv);
  return RUN_ALL_TESTS();
}

编译运行:g++ gtest.cpp -lgtest -lpthread -o gtest

运行结果:
Gtest测试结果
Gtest框架安装完成。

方法二:使用apt-get工具安装

刚刚接触Gtest时,在Ubuntu18.04环境下使用方法一安装,安装之后对Gtest框架进行测试时存在版本不兼容的问题,测试源码编译之后无法链接-lgtest和-lgtest_main库。
在这里插入图片描述
这里介绍第二种解决办法,使用apt-get工具安装。

sudo apt-get install libgtest-dev

进入/usr/src目录下查看是否存在gtest和googlegtest文件夹,如果存在并且可以访问则进入下一步,否则可以卸载重新安装:sudo apt-get autoremove libgtest-dev

但是使用这个方法也遇到了方法一种-lgtest和-lgtest_main不兼容的问题,可以在安装命令行之后添加cmake约束。

sudo apt-get install libgtest-dev cmake
cd /usr/src/gtest
sudo cmake CMakeLists.txt
sudo make
sudo cp *.a /usr/lib

安装完成,可以按照方法一中的样例进行测试。

方法三、直接使用gtest的头文件和生成的静态库进行单元测试

新建一个文件夹,然后下载gtest源码,使用cmake和make生成gtest静态库。

cd /
mkdir ./workspace
cd workspace
git clone https://github.com/google/googletest
cd googletest
mkdir build
cmake ..
make

/googletest/googletest/include/gtest目录下是gtest的头文件,在/googletest/build/lib目录下是gtest生成的静态库*.a文件。
/workspace下新建文件夹test_unit作为项目总路径。
项目文件目录

|--test_unit
|  |
|  +--gtest.cpp
|  |
|  +--include
|    +--gtest
|        +--*.h
|  |
|  +--lib
|    +--*.a

下载后,将gtets的头文件和静态库复制到test_unit相应的路径下。

cd /workspace
mkdir test_unit && cd test_unit
mkdir lib
mkdir include
cp -rf /workspace/googletest/googletest/include/gtest ./include
cp /workspace/googletest/build/lib/*.a ./lib

gtest.cpp的样例代码:

#include<gtest/gtest.h>
// Returns true iff n is a prime number.
bool IsPrime(int n)
{
    // Trivial case 1: small numbers
    if (n <= 1) return false;

    // Trivial case 2: even numbers
    if (n % 2 == 0) return n == 2;

    // Now, we have that n is odd and n >= 3.

    // Try to divide n by every odd number i, starting from 3
    for (int i = 3; ; i += 2) {
        // We only have to try i up to the squre root of n
        if (i > n/i) break;

        // Now, we have i <= n/i < n.
        // If n is divisible by i, n is not prime.
        if (n % i == 0) return false;
    }
    // n has no integer factor in the range (1, n), and thus is prime.
    return true;
}

class IsPrimeParamTest : public::testing::TestWithParam<int>
{
};

TEST_P(IsPrimeParamTest, HandleTrueReturn)
{
    int n =  GetParam();
    EXPECT_TRUE(IsPrime(n));
}

INSTANTIATE_TEST_CASE_P(TrueReturn, IsPrimeParamTest, testing::Values(3, 5, 11, 16 ,19 ,21 , 23, 17));

手动链接gtest的头文件和静态库:

g++ gtest.cpp -I ./include/gtest -L ./lib -lgtest_main -lgtest -lpthread -o gtest

其中g++ -I为编译程序按照-I指定的路径去搜索头文件;g++ -L为编译程序按照-L指定的路进去寻找库文件。
测试结果为:
在这里插入图片描述
直接调用Gtest头文件和静态库成功。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ubuntu18.04环境下Gtest框架安装测试 的相关文章

  • libusb 和轮询/选择

    我正在使用 Linux 操作系统 想知道是否有任何文件描述符可以轮询 选择 当数据等待从 USB 设备读取时会触发这些文件描述符 我也在使用 libusb 库 但尚未找到可以使用的文件描述符 Use libusb 的轮询函数 http li
  • 干净地销毁System V共享内存段

    我在用shmget shmat and shmctl分别获取和创建共享内存段 将其附加到进程地址空间中并删除它 我想知道进程是否仍然可以使用共享内存段 即使它已被分离并要求使用删除 shmctl id IPC RMID 在一个过程中 我无法
  • 从 gitlab docker runner 启动声纳扫描仪

    我有一个 CI 工作流程 集成了 linting 作业和代码质量作业 我的 Linting 工作是一个 docker runner 从应用程序代码启动我的 eslint 脚本 然后我的代码质量工作应该启动声纳扫描仪泊坞窗实例 检查我的代码并
  • 使用 linux perf 工具测量应用程序的 FLOP

    我想使用 perf Linux 性能计数器子系统的新命令行接口命令 来测量某些应用程序执行的浮点和算术运算的数量 出于测试目的 我使用了我创建的一个简单的虚拟应用程序 请参见下文 因为我找不到任何为测量 FP 和整数运算而定义的 perf
  • 如何修改s_client的代码?

    我正在玩apps s client c in the openssl源代码 我想进行一些更改并运行它 但是在保存文件并执行操作后 我的更改没有得到反映make all or a make 例如 我改变了sc usage函数为此 BIO pr
  • 在Linux伪终端中执行从一个终端发送到另一个终端的字符串

    假设我有一个终端 其中 tty 的输出是 dev pts 2 我想从另一个终端向第一个终端发送命令并执行它 使用 echo ls gt dev pts 2 仅在第一个终端中打印 ls 有没有办法执行字符串 不 终端不执行命令 它们只是数据的
  • 如何“grep”连续流?

    可以用吗grep在连续的流中 我的意思是有点tail f
  • Snap-confine 具有提升的权限,并且不受限制,但应该受到限制。拒绝继续避免权限升级攻击

    我已经使用 snap 一段时间了 但最近升级后 当我尝试打开任何应用程序时 出现此错误 Snap confine has elevated permissions and is not confined but should be Refu
  • Mono 和 WebRequest 速度 - 测试

    在 mono 4 6 2 linux 中 我注意到 wget 下载文件的速度与webclient DownloadString 所以我做了一个小测试来调查 为什么 wget 明显比 C 快 根据我自己的实验 使用 wget 下载 手动读取文
  • 有关 Linux 内存类型的问题

    关于Linux内存我有以下问题 我知道活动内存是最常访问的内存部分 但是有人可以解释一下 linux 如何考虑将内存位置用于活动内存或非活动内存 主动存储器由哪些部分组成 磁盘 文件缓存是否被视为活动内存的一部分 有什么区别Buffers
  • 使用 C++ 输出字符串覆盖 Linux 终端上的最后一个字符串

    假设我有一个命令行程序 有没有办法让我说的时候 std cout lt lt stuff 如果我不做std cout lt lt n 在另一个之间std cout lt lt stuff 东西的另一个输出将覆盖同一行上的最后一个东西 清理行
  • 无法为 Python 3.4 创建工作虚拟环境

    I 安装Python 3 4 2 https docs python org 3 using unix html building python和我的 Linux Mint 17 1 中的 Virtualenv 12 0 5 然后我尝试创建
  • 我在哪里可以学习如何使 C++ 程序与操作系统 (Linux) 交互

    我是一个 C 初学者 我想创建与操作系统交互的小程序 使用 Kubuntu Linux 到目前为止 我还没有找到任何教程或手册来让 C 与操作系统交互 在 PHP 中 我可以使用命令 exec 或反引号运算符来启动通常在控制台中执行的命令
  • Linux TCP服务器:在接受连接之前读取客户端的IP地址

    Related C Winsock API如何在接受连接之前获取连接客户端IP https stackoverflow com questions 716209 c winsock api how to get connecting cli
  • 退出 bash 脚本但保持进程运行

    我正在运行服务器 需要使用参数执行以下命令 这些脚本目前工作得很好 但问题是当我运行脚本时我无法返回到控制台 它在控制台中保持运行 如果我强行停止它 那么该过程也会停止 我想继续运行该进程并返回到控制台 bin sh php home st
  • 如何阅读shell命令的源代码?

    我想阅读编写linux命令的实际源代码 我已经获得了一些使用它们的经验 现在我认为是时候与我的机器进行更深层次的交互了 我在这里找到了一些命令http directory fsf org wiki GNU http directory fs
  • 如何在 Linux 中使用单行命令获取 Java 版本

    我想通过单个命令获取 Linux 中的 Java 版本 我是 awk 的新手 所以我正在尝试类似的事情 java version awk print 3 但这不会返回版本 我将如何获取1 6 0 21从下面的Java版本输出 java ve
  • 如何在两个不同帐户之间设置无密码身份验证

    我们可以在两台机器的两种不同用途之间设置无密码身份验证吗 例如 计算机A有用户A 计算机B有用户B 我们可以设置密码 ssh 以便计算机 A 上的用户 A 使用其用户帐户 A 登录计算机 B 谢谢你 如果我理解你的问题 你能设置一下吗ssh
  • 如何使用ffmpeg重叠和合并多个音频文件?

    我正在尝试将多个音频文件合并到一个文件中 但我可以使用以下命令来连接 而不是连接 ffmpeg v debug i file1 wav i file2 wav i file3 wav filter complex 0 0 concat n
  • Windows 与 Linux 文本文件读取

    问题是 我最近从 Windows 切换到 Ubuntu 我的一些用于分析数据文件的 python 脚本给了我错误 我不确定如何正确解决 我当前仪器的数据文件输出如下 Header 有关仪器等的各种信息 Data 状态 代码 温度 字段等 0

随机推荐

  • HT1621B液晶驱动(附电路图)

    最近做了一个项目用到了HT1621 电路图 datasheet code HT1621B datasheet include ht1621 h void ht1621 send high order data UCHAR data UCHA
  • JS实现数组扁平化的 5 种方式

    一 普通递归的思路很容易理解 就是通过for循环的方式 逐层逐个元素地去展平 如果当前元素是一个数组 那么就对它进行递归处理 再将递归处理的结果拼接到结果数组上 let arr 1 2 3 4 5 function flatten arr
  • 【简易广告机】利用树莓派制作一个简易的广告机(1)

    利用树莓派做一个简单的广告机 废话不多说开始 1 安装 omxplayer omxplayer 简易介绍 omxplayer是专门针对树莓派的GPU的播放器 支持硬件解码 最高支持分辨率是1080P omxplayer这个命令行播放器 是专
  • 怎么修改vue项目图标和标题

    要修改 Vue 项目的图标和标题 需要在 Vue 项目的 public 目录下添加 favicon ico 文件作为图标 并在 index html 中通过标签修改标题 具体步骤如下 在 public 目录下添加图标 favicon ico
  • 【环境配置】Collecting package metadata (current_repodata.json): failed的问题解决

    在使用conda创建新环境时 出现Collecting package metadata current repodata json failed的问题 尝试了很多方法都没有解决 最后解决了 解决链接 https download csdn
  • JPEG编码过程详解

    JPEG编码过程详解 本文旨在对JPEG编码过程中的细节步骤进行说明 具体原理部分请参照Wikipedia 色彩空间转换 原始图像的像素点是以RGB形式存储的 即每个像素点由3个字节的数据组成 分别为Red通道 Green通道和Blue通道
  • sqlite数据库查看里面数据库版本号

    在android sqlite数据库开发中 常会把手机上的具体数据库拷贝到电脑上进行查看 而数据库升级也比较多 升级也容易出问题 如果有时候某个用户报了一个bug或者测试测出一个bug 然后把他的数据库 db文件拷贝给你 这时候你需要先确定
  • 多线程:多个线程共享数据

    在 Java 传统线程机制中的共享数据方式 大致可以简单分两种情况 多个线程行为一致 共同操作一个数据源 也就是每个线程执行的代码相同 可以使用同一个 Runnable 对象 这个 Runnable 对象中有那个共享数据 例如 卖票系统就可
  • 更进一步!可视化一切递归算法!

    学算法认准 labuladong 后台回复课程查看精品课 点击卡片可搜索文章 在线学习网站 https labuladong gitee io algo 上次我发布了算法代码可视化功能 适配了我的网站和我的系列插件 最近我修复了一些 bug
  • 有测试辐射的软件,装个可以查看辐射的APP应用,测测你的手机辐射有多大

    近日关于一款检测手机辐射量的应用Tawkon开始受到媒体和用户关注 这款软件早在去年就已经准备推出iOS版本 最终因为苹果API限制被帮主拒绝 随后他们又开始准备Android版本 并于近日正式发布 手机辐射到现在依然是一个争议性话题 没有
  • 使用指针实现: 输入两个字符串,将这两个字符串连接后输出。

    使用指针实现 输入两个字符串 将这两个字符串连接后输出 include
  • SpringSecurity解决跨域问题的方法

    跨域问题产生原因 现在越来越多的项目都采用前后端分离的开发模式 以实现前后端代码解耦的目的 处于安全考虑 后端服务器对收到的请求进行了限制和区分 因此出现跨域访问不到数据的情况 什么是跨域 当协议 域名 端口号 有一个或多个不同时 前端请求
  • Jira、Redmine横向对比:哪个更适合做研发项目管理

    如果你是一个软件开发团队的成员或者负责人 你可能会遇到这样的问题 该选择哪种项目管理和协作工具来提高工作效率和质量 市面上有很多这样的工具 比如 Redmine 和 Jira 它们都有各自的优缺点 适合不同的场景和需求 本文将从以下几个方面
  • nginx之虚拟主机与请求的分发

    由于IP地址有限 因此经常存在多个主机域名对应同一个IP地址的情况 这时nginx conf中就可以按照server name 对应用户请求中的主机域名 并通过server块来定义虚拟主机 每个server块就是一个虚拟主机 它只处理与之相
  • spring boot学习:yaml配置文件

    实际上配置文件application properties还有application yaml application yml 我自己实际使用中 就是感觉用yaml能省不少 但是要注意换行空格符号 举个例子有两个属性 server port
  • Thread Local Storage---__thread 关键字的使用方法

    转自 http blog csdn net yusiguyuan article details 22938671 thread是GCC内置的线程局部存储设施 存取效率可以和全局变量相比 thread变量每一个线程有一份独立实体 各个线程的
  • 使用 VS Code SSH 到远程服务器进行开发

    一 引言 最近在搜索有关自带 ssh ftp ssh 功能的编辑器 没想到竟然又搜回到了 VS Code 二 转发 这里转发 VS Code 的一篇介绍 Remove Developing 的文章 里面使用了 Remote SSH 插件基本
  • matplotlib多纵轴_python画图初学--matplotlib

    适用者 有一定的python基础 会逐渐学习更多matplotlib的实例 实验环境 python3 6 1 安装依赖包 pip 2 导入依赖包 import numpy as np import matplotlib pyplot as
  • dedeCms恢复数据库后乱码

    好久没做网站了 最近看到不少模板源码 于是下了些来玩 找了个免费无任何限制只带广告的国外空间 但是在dedeCMS恢复数据乱码时出现了问题 都是知道这玩意就是编码的问题 不过不细心的人在使用dedeCMS可能会由于恢复数据时勾上了 还原表结
  • Ubuntu18.04环境下Gtest框架安装测试

    准备 在安装Gtest框架之前在linux上安装好cmke g 工具 sudo apt get install cmake sudo apt get install g 方法一 下载Gtest压缩包解压安装 最新版本的Gtest下载链接 h