如何在项目中引入googtest(下)——通过CMake引入库

简介: 如何在项目中引入googtest(下)——通过CMake引入库

一、书接上回

上篇文章参考链接🔗通过编译器引入gtest 我们不妨回顾一下:
| 编译器引入gtest需要:静态库.lib文件、inlucde头文件 |
|--|
| 1.将头文件“目录”链接入项目|
| 2.将静态lib或动态dll库“目录”链接入项目|
| 3.告诉编译器有那几个库|

其实我们通过CMake引入动态库也只需要这三板斧,当然作为初学者,记住的只是表像,如果要深入理解这些库链接啥的一定要好好阅读《程序员的自我修养》。话不多说,直接开搞。

二、新建工程项目

当然我们需要提前准备好 "头文件" 以及编译好的 gtest静态库 具体操作可参考:🔗通过编译器引入gtest

2.1 文件结构

在这里插入图片描述

2.2 编写CMakeLists

首先引入CMakeLists的基础内容:

#设置cmake的最低版本
cmake_minimum_required(VERSION 3.10)
# 设置工程的名称
project(logic)
# 将源代码添加到工程生成可执行文件
add_executable(logic main.cpp)

通过VS2022打开CMakeList:
在这里插入图片描述

三、 通过CMakeLists使用链接三板斧

参考🔗爱编程的大丙

3.1 将头文件“目录”链接入项目

在编译项目源文件的时候,很多时候都需要将源文件对应的头文件路径指定出来,这样才能保证在编译过程中编译器能够找到这些头文件,并顺利通过编译。
include_directories(test/include)

(👁️_👁️)知识扩充:
include_directories()add_subdirectory()的区别:
前者是针对当前CMakeLists的生成项目引入文件夹。
后者是添加CMakeLists的子节点,是以CMakeLists为主题的树的子节点。

3.2 将静态lib或动态dll库“目录”链接入项目

link_directories() 是用来指定要链接库(静态动态都行)的路径的,如果程序链接的是静态库,也可以使用 include_directories()指定头文件。如果是动态库,请直接使用link_directories()
方法一:使用动态库静态库通用方法
cpp link_directories(test/lib)
方法二:和加入头文件一样
include_directories(test/lib)

3.3 告诉编译器有那几个库

link_libraries([目标] [库名称])
参数 1:指定出要链接的静态库的名字
可以是全名 libxxx.a
也可以是掐头(lib)去尾(.a)之后的名字 xxx
参数 2:静态库的路径

此处必须指定绝对路径

link_libraries(${
   
   CMAKE_CURRENT_SOURCE_DIR}/test/lib/gtestd.lib)
link_libraries(${
   
   CMAKE_CURRENT_SOURCE_DIR}/test/lib/gmockd.lib)

四、遇到问题

参考链接🔗
和我们编译器引入库之后又遇到问题了,库之间编译方式不匹配的问题了,我们再回顾下:
在这里插入图片描述

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

#设置默认的编译模式
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")

五、测试代码

#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;
}

六、整体CMakeLists.txt

#设置cmake的最低版本
cmake_minimum_required(VERSION 3.10)
# 设置工程的名称
project(logic)

#设置默认的编译模式
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")

#添加 “静态库、库文件”  的文件夹 到该项目中
include_directories(test/include)
include_directories(test/lib)
link_libraries(${
   
   CMAKE_CURRENT_SOURCE_DIR}/test/lib/gtestd.lib)
#将源代码添加到工程
add_executable(logic main.cpp)
相关文章
|
机器学习/深度学习 编解码 计算机视觉
Transformer又一城 | Swin-Unet:首个纯Transformer的医学图像分割模型解读
Transformer又一城 | Swin-Unet:首个纯Transformer的医学图像分割模型解读
2753 0
|
测试技术
[googletest] --- 简易使用教程
[googletest] --- 简易使用教程
1235 0
|
XML Java Maven
Spring 手动实现Spring底层机制
Spring 第六节 手动实现Spring底层机制 万字详解!
563 32
|
JavaScript 前端开发 Java
通过Gtest访问C++静态、私有、保护变量和方法
通过Gtest访问C++静态、私有、保护变量和方法
460 1
|
存储 C++
【C++】Visual Studio C++ 配置并使用gtest(不好用你捶我)
【C++】Visual Studio C++ 配置并使用gtest(不好用你捶我)
Vue3走马灯(Carousel)
这是一个基于 Vue2 的走马灯(Carousel)组件,支持丰富的自定义配置。主要属性包括图片数组、宽度、高度、自动切换、暂停轮播、过渡效果、轮播间隔、箭头和指示点等。组件提供了多种过渡效果(如滑动和渐变)及动画时长设置,并允许自定义箭头和指示点的样式。此外,还支持通过键盘方向键进行切换,提供了灵活的使用方法。
873 3
Vue3走马灯(Carousel)
|
消息中间件 存储 安全
|
API
通用图片搜索-搜狗源免费API接口教程
该接口用于搜索指定关键词并返回搜狗图片搜索结果,支持POST和GET请求。主要参数包括用户ID、用户KEY、关键词、页码及返回图片类型等。返回结果包含状态码、信息提示、结果集及当前页码。示例中提供了详细的请求与响应格式。
1423 5
|
缓存 自然语言处理 JavaScript
万字长文深度解析JDK序列化原理及Fury高度兼容的极致性能实现
Fury是一个基于JIT动态编译的高性能多语言原生序列化框架,支持Java/Python/Golang/C++/JavaScript等语言,提供全自动的对象多语言/跨语言序列化能力,以及相比于别的框架最高20~200倍的性能。
169328 12
|
算法 安全 NoSQL
详解高性能无锁队列的实现-2
详解高性能无锁队列的实现
496 0