如何在项目中引入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)
相关文章
|
4天前
|
程序员 API 数据库
【Cmake工程 库相关教程 】深入理解CMake工程C/C++ 库管理技巧
【Cmake工程 库相关教程 】深入理解CMake工程C/C++ 库管理技巧
72 1
|
4天前
|
开发框架 Unix Linux
深度探索:Qt CMake工程编译后的自动打包策略
深度探索:Qt CMake工程编译后的自动打包策略
42 0
|
4天前
|
存储 缓存 Unix
CMake基础(8)包含第三方库
CMake基础(8)包含第三方库
9 1
|
4天前
|
程序员 Linux C语言
【cmake 项目依赖冲突】CMake进阶:优雅解决目标依赖和安装问题
【cmake 项目依赖冲突】CMake进阶:优雅解决目标依赖和安装问题
84 0
|
4天前
|
数据可视化 算法 C++
C++ cmake工程引入qt6和Quick 教程
C++ cmake工程引入qt6和Quick 教程
53 0
|
4天前
|
缓存 Unix 编译器
Cmake 的构建结构:理解 Cmake 的构建过程和依赖管理
Cmake 的构建结构:理解 Cmake 的构建过程和依赖管理
61 0
|
4天前
|
Java Maven
Maven项目模块打包引入
Maven项目模块打包引入
29 0
|
4天前
RuntimeSchema包无法引入问题
RuntimeSchema包无法引入问题
13 0
|
4天前
|
JavaScript 调度
【源码&库】 Vue3 的依赖收集,这里的依赖指代的是什么?
【源码&库】 Vue3 的依赖收集,这里的依赖指代的是什么?
46 0
【源码&库】 Vue3 的依赖收集,这里的依赖指代的是什么?
|
6月前
|
JavaScript 前端开发 Java
项目引入文件的常见报错
项目引入文件的常见报错
50 5