如何在项目中引入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代码包与引入全解
67 0
|
7月前
|
程序员 开发工具 开发者
库和框架的区别
库和框架的区别
37 0
|
8月前
|
JavaScript 调度
【源码&库】 Vue3 的依赖收集,这里的依赖指代的是什么?
【源码&库】 Vue3 的依赖收集,这里的依赖指代的是什么?
96 0
【源码&库】 Vue3 的依赖收集,这里的依赖指代的是什么?
|
JavaScript 前端开发 Java
项目引入文件的常见报错
项目引入文件的常见报错
91 5
|
8月前
|
前端开发 开发工具 git
React项目包结构的作用
React项目包结构的作用
123 0
|
编译器 程序员 C++
如何在项目中引入googtest(下)——通过CMake引入库
如何在项目中引入googtest(下)——通过CMake引入库
209 0
|
JavaScript 测试技术 编译器
从0搭建Vue3组件库:引入单元测试框架Vitest
从0搭建Vue3组件库:引入单元测试框架Vitest
942 0
|
机器学习/深度学习 数据可视化 数据挖掘
【学习】代码里引入的包都是啥东西
【学习】代码里引入的包都是啥东西
170 0
|
缓存 自然语言处理 JavaScript
vue3 源码学习,实现一个 mini-vue(十三):compiler 编译器 - 编译时核心设计原则
从这一章开始我们进入到 compiler 编译器模块的实现。 在实现 compiler 编译器模块之前,我们先来了解一下 vue 的编译时核心设计原则
vue3 源码学习,实现一个 mini-vue(十三):compiler 编译器 - 编译时核心设计原则
|
JavaScript 内存技术
elecctron引入robotjs的坑
elecctron引入robotjs的坑
856 0

热门文章

最新文章