如何在项目中引入googtest(上)——通过编译器引入库

简介: 如何在项目中引入googtest(上)——通过编译器引入库

一、背景

关于googletest之前的博客已经详细地做了一个叙述:参考链接
现在想再自己写的一个Demo中引入googletest并且采用测试驱动开发(Test-Driven Development,TDD)(即:先写测试案例,再完善功能代码,一边写、一边完善)的这种模式。现在将这过程中踩的坑,总结成此博客。

二、资源准备

2.1 源码链接

googletest资源链接

https://gitcode.net/mirrors/google/googletest?utm_source=csdn_github_accelerator

2.2 解压编译

①解压缩后得到如下文件:
在这里插入图片描述
②通过VS打开gtest中的CMakeList:
路径为:

googletest-master\googletest-master\CMakeLists.txt

在这里插入图片描述
③编译静态库:
在这里插入图片描述

2.3 获取生成库和头文件

生成完成后在路径下得到4个静态库:
bash googletest-master\googletest-master\out\build\x64-Debug\lib
注意:带d的是Windows的debug版本库,不带d的是Windows的release版本库
在这里插入图片描述
获取头文件:
googletest-master\googletest-master\googletest\include

在这里插入图片描述

三、准备Demo

3.1 新建一个工程文件在这里插入图片描述

3.2 新建一个libinlucde文件

在这里插入图片描述

将4个编译好的静态库文件放入lib
在这里插入图片描述
将gtest文件放入inlucde中
在这里插入图片描述
## 3.3 将【静态库文件夹、头文件、静态库】引入项目
参考 只都一本心术书的博客
①引入头文件夹: 项目–配置属性–c/c+±-常规–附加包含目录–编辑–添加工程
在这里插入图片描述
include路径(考虑到工程的可移植性,可以用右下角的宏定义对路径进行简略)比如 $(ProjectDir)/include
在这里插入图片描述
引入lib文件夹: 项目–配置属性–链接器–常规–链接库依赖项–编辑–添加工程lib路径
(这里你可能会遇到没有链接器这个子选项的问题,解决方法:项目–属性–配置属性–常规–配置类型–选择动态链接库或者应用程序–应用)
在这里插入图片描述
include路径(考虑到工程的可移植性,可以用右下角的宏定义对路径进行简略)比如 $(ProjectDir)/include
在这里插入图片描述


引入库: 项目–配置属性–链接器–输入–附加依赖项
在这里插入图片描述
# 四、报错警告
引入之后,我们发现项目已经可以找到头文件了并且编译通过
在这里插入图片描述
但是引入测试代码的时候缺报错了:error LNK2038: 检测到“RuntimeLibrary”的不匹配项
在这里插入图片描述
原因:项目文件编译方式和库文件不匹配

库文件是MTD_StaticDebug,项目文件编译方式是MTD_DynamicDebug
参考链接
在这里插入图片描述

这四个选项对应的含义如下:
| 选项 |编译方式 |
|--|--|
| 多线程调试Dll (/MDd) |MD_DynamicDebug |
| 多线程Dll (/MD) |MD_DynamicRelease|
| 多线程(/MT) |MD_StaticRelease |
| 多线程(/MTd)(/MDd) |MD_StaticDebug |

但是有时候你会发现并不是这么简单,明明自己用的是Release模式,为什么选/MD还是会报错呢?
这个原因在于你在:工程属性->链接器->输入->附加依赖项
中添加的.lib有问题。一般lib文件会有后缀带d和不带d的两种,带d的对应的是Debug模式,不带d的对应的是Release模式。把这个改过来说不定就能解决你的问题了。

五、测试代码

#include<iostream>
#include"gtest/gtest.h"
using namespace std;
int main(int argc, char** argv)
{
   
   
    EXPECT_EQ(1 + 1, 2);
    testing::InitGoogleTest(&argc, argv);
    RUN_ALL_TESTS();
    return 0;
}

运行结果:
在这里插入图片描述

六、开始写Demo

采用测试驱动开发去写你的Demo吧!冲!冲!冲!

相关文章
|
JSON 测试技术 Go
Go代码包与引入全解
Go代码包与引入全解
57 0
|
2月前
|
前端开发 开发者
在前端开发中,webpack 作为模块打包工具,其 DefinePlugin 插件可在编译时动态定义全局变量,支持环境变量定义、配置参数动态化及条件编译等功能。
在前端开发中,webpack 作为模块打包工具,其 DefinePlugin 插件可在编译时动态定义全局变量,支持环境变量定义、配置参数动态化及条件编译等功能。本文阐述 DefinePlugin 的原理、用法及案例,包括安装配置、具体示例(如动态加载资源、配置接口地址)和注意事项,帮助开发者更好地利用此插件优化项目。
71 0
|
5月前
|
自然语言处理
ESM规范在编译阶段如何确定模块的依赖关系
ESM规范在编译阶段如何确定模块的依赖关系
ESM规范如何处理循环依赖的情况
ESM规范如何处理循环依赖的情况
|
11月前
|
JavaScript 前端开发 Java
项目引入文件的常见报错
项目引入文件的常见报错
78 5
|
Linux Android开发
增加预编译头加快QT工程编译速度的方法
增加预编译头加快QT工程编译速度的方法
146 0
|
编译器 程序员 C++
如何在项目中引入googtest(下)——通过CMake引入库
如何在项目中引入googtest(下)——通过CMake引入库
162 0
|
机器学习/深度学习 数据可视化 数据挖掘
【学习】代码里引入的包都是啥东西
【学习】代码里引入的包都是啥东西
160 0
|
JavaScript 开发者
Vite 在运行过程中是如何发现新增依赖的?
Vite 在运行过程中是如何发现新增依赖的?
223 0
|
JavaScript 内存技术
elecctron引入robotjs的坑
elecctron引入robotjs的坑
817 0