gtest使用入门(6)-win下使用vscode和cmake构建

2023-10-30

概述

最近尝试在windows下使用googletest, 并使用CMake进行构建,把学习的过程记录下来。
构建环境和工具:
1、win10 64位
2、visual studio code
3、CMake for windows
4、mingw64 for window
5、LLVM for windows

一、环境准备

需要准备如下环境:

  • 1、mingw64,并配置mingw64下的bin目录为环境变量

在这里插入图片描述

  • 2、cmake程序,并配置cmake.exe所在的目录为环境变量

在这里插入图片描述

  • 3、LLVM,并配置其bin目录为环境变量

在这里插入图片描述

  • 4、Visual Studio code安装,并安装C/C++插件。

二、源码准备

创建一个待测的源码,为了更贴合项目工程,这里直接使用CMake工程的方式构建源码,以一个两个数交换值的例程举例。

先创建一个gtest_win目录,然后使用vscode打开这个文件夹,

使用vscode在gtest_win里面创建一个src文件夹,用来放源码,

src文件夹下面创建include文件夹,用于存放头文件,创建swap文件夹,然后新建swap.h头文件

swap.h文件内容如下:

#ifndef __SWAP_H_
#define __SWAP_H_


void swap(int &a, int &b);

#endif // !__SWAP_H_

再创建src文件夹用于存放源文件,在gtest_win/src/src下创建swap.cpp文件,文件内容如下:

#include "swap/swap.h"

/**
 * @description: 两个数交换
 * @param : 传入两个值
 * @return {*}
 */
void swap(int &a, int &b) {
    int temp;
    temp = a;
    a = b;
    b = temp;
}

在gtest_win/src下创建main.cpp文件,文件内容如下:


#include <iostream>

#include "swap/swap.h"

using namespace std;

int main(int argc, char **argv) {
    int val1 = 10;
    int val2 = 20;
    cout << "before swap: val1=" << val1 << ", val2=" << val2 << endl;
    swap(val1, val2);
    cout << "after swap: val1=" << val1 << ", val2=" << val2 << endl;
    return 0;
}

最后在gtest_win目录下创建CMakeLists.txt文件,文件内容如下:

cmake_minimum_required(VERSION 3.0)  # cmake -G "MinGW Makefiles" ..
project(GTESTWIN)

# 头文件目录
include_directories("${CMAKE_CURRENT_SOURCE_DIR}/src/include")
# 源文件目录
AUX_SOURCE_DIRECTORY("${CMAKE_CURRENT_SOURCE_DIR}/src/src" DIR_SRCS)

# 生成可执行文件
add_executable(gtest_win ./src/main.cpp ${DIR_SRCS})

创建在gtest_win下创建build目录,用于存放构建的产物,这样就不会在源码中输出乱七八糟的东西让目录变得很乱。
最后目录结构如下:

在这里插入图片描述

VSCODE下右键build文件夹,在集成终端中打开

在这里插入图片描述

输入如下命令进行构建并编译,确保我们准备的待测源码可以正常编译和执行:

cmake -G "MinGW Makefiles" ..
make
gtest_win.exe

这里cmake加上-G “MinGW Makefiles” 参数是在win下cmake会默认构建mscv工程,加上这个参数会默认使用gnu构建。

一切正常将会输出如下内容,这样我们的待测源码就准备好了:

D:\Projects\gtest181\gtest_win\build>cmake -G "MinGW Makefiles" ..
-- The C compiler identification is GNU 8.1.0
-- The CXX compiler identification is GNU 8.1.0
-- Check for working C compiler: D:/Program Files/mingw64/bin/gcc.exe
-- Check for working C compiler: D:/Program Files/mingw64/bin/gcc.exe - works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: D:/Program Files/mingw64/bin/g++.exe
-- Check for working CXX compiler: D:/Program Files/mingw64/bin/g++.exe - works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: D:/Projects/gtest181/gtest_win/build

D:\Projects\gtest181\gtest_win\build>make
Scanning dependencies of target gtest_win
[ 33%] Building CXX object CMakeFiles/gtest_win.dir/src/main.cpp.obj
[ 66%] Building CXX object CMakeFiles/gtest_win.dir/src/src/swap.cpp.obj
[100%] Linking CXX executable gtest_win.exe
[100%] Built target gtest_win

D:\Projects\gtest181\gtest_win\build>gtest_win.exe
before swap: val1=10, val2=20
after swap: val1=20, val2=10

D:\Projects\gtest181\gtest_win\build>

在这里插入图片描述

三、准备googletest源码和测试代码

1、在gtest_win目录下创建test文件夹,用于存放googletest源码和我们的测试代码。
把下载下来的googletest-release-1.8.1文件夹放到test文件夹下。

googletest-release-1.8.1下载方法可参考:https://blog.csdn.net/wdcyf15/article/details/108855960

2、在test文件夹下创建test_swap.cpp文件,文件内容如下:

#include <limits.h>
#include "gtest/gtest.h"
#include "gmock/gmock.h"

#include <cstdlib>
#include <iostream>
#include <string>

#include "swap/swap.h"


using ::testing::_;
using ::testing::Return;
using ::testing::AtLeast;
using ::testing::Exactly;
using namespace testing;
using namespace std;


TEST(SWAP_TEST, SWAP_TWO_INT) {
    int val1 = 10;
    int val2 = 20;
    swap(val1, val2);
    EXPECT_EQ(20, val1);
    EXPECT_EQ(10, val2);
}

3、在test文件夹下创建CMakeLists.txt文件,用于构建测试程序,文件内容如下:

cmake_minimum_required(VERSION 3.0)  # cmake -G "MinGW Makefiles" ..
project(GTESTWIN_TEST)

# gtest库相关
# 如果把gtest放到test目录下,则使用如下包含关系:
add_subdirectory(./googletest-release-1.8.1)  # 编译gtest
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/googletest-release-1.8.1/googletest/include)  # 包含gtest等头文件
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/googletest-release-1.8.1/googlemock/include)  # 包含gmock等头文件


# 头文件目录
include_directories("../src/include")
# 源文件目录
AUX_SOURCE_DIRECTORY("../src/src" SRCS)

# 测试代码目录
AUX_SOURCE_DIRECTORY("${CMAKE_CURRENT_SOURCE_DIR}" TEST_SRCS)

# 生成测试可执行程序
add_executable(gtest_win_test ${DIR_SRCS} ${TEST_SRCS})

# 链接测试库,pthread 库一定要写在 ${GTEST_BOTH_LIBRARIES} 的后面, 否则编译时会报错,
# GTEST_BOTH_LIBRARIES表示链接google test的两个库
target_link_libraries( gtest_win_test
        PRIVATE 
        gtest
        gtest_main  # 使用gtest带的main函数,如果检测到外部有main函数,则使用外部main函数,外部main函数要配置gtest初始化。
        gmock
        gmock_main  # 使用gmock带的main函数,如果检测到外部有main函数,则使用外部main函数,与gtest_main同时存在则自动配置。
        pthread )

test最终的目录结构如下:

在这里插入图片描述

这样测试代码就准备好了,下面我们开始构建和编译测试代码。

四、构建并编译源码和测试代码

在此我们将把测试代码作为源码的子工程添加到源码中,测试代码的CMake工程为test文件夹,
所有我们修改gtest_win目录下的CMakeLists.txt,在最后一行添加:

add_subdirectory(test)

文件所有内容如下:

cmake_minimum_required(VERSION 3.0)  # cmake -G "MinGW Makefiles" ..
project(GTESTWIN)

# 头文件目录
include_directories("${CMAKE_CURRENT_SOURCE_DIR}/src/include")
# 源文件目录
AUX_SOURCE_DIRECTORY("${CMAKE_CURRENT_SOURCE_DIR}/src/src" DIR_SRCS)

# 生成可执行文件
add_executable(gtest_win ./src/main.cpp ${DIR_SRCS})

# 增加测试工程
add_subdirectory(test)

再次打开build目录终端,输入如下命令进行构建和编译:

cmake -G "MinGW Makefiles" ..
make

如果顺利,将会输出如下内容:

D:\Projects\gtest181\gtest_win\build>cmake -G "MinGW Makefiles" ..
-- The C compiler identification is GNU 8.1.0
-- The CXX compiler identification is GNU 8.1.0
-- Check for working C compiler: D:/Program Files/mingw64/bin/gcc.exe
-- Check for working C compiler: D:/Program Files/mingw64/bin/gcc.exe - works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: D:/Program Files/mingw64/bin/g++.exe
-- Check for working CXX compiler: D:/Program Files/mingw64/bin/g++.exe - works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found PythonInterp: C:/Users/uidq0460.V01/AppData/Local/Programs/Python/Python37/python.exe (found version "3.7.3")
-- Configuring done
-- Generating done
-- Build files have been written to: D:/Projects/gtest181/gtest_win/build

D:\Projects\gtest181\gtest_win\build>make
Scanning dependencies of target gtest_win
[  7%] Building CXX object CMakeFiles/gtest_win.dir/src/main.cpp.obj
[ 14%] Building CXX object CMakeFiles/gtest_win.dir/src/src/swap.cpp.obj
[ 21%] Linking CXX executable gtest_win.exe
[ 21%] Built target gtest_win
Scanning dependencies of target gtest
[ 28%] Building CXX object test/googletest-release-1.8.1/googlemock/gtest/CMakeFiles/gtest.dir/src/gtest-all.cc.obj
[ 35%] Linking CXX static library libgtest.a
[ 35%] Built target gtest
Scanning dependencies of target gtest_main
[ 42%] Building CXX object test/googletest-release-1.8.1/googlemock/gtest/CMakeFiles/gtest_main.dir/src/gtest_main.cc.obj
[ 50%] Linking CXX static library libgtest_main.a
[ 50%] Built target gtest_main
Scanning dependencies of target gmock
[ 57%] Building CXX object test/googletest-release-1.8.1/googlemock/CMakeFiles/gmock.dir/src/gmock-all.cc.obj
[ 64%] Linking CXX static library libgmock.a
[ 64%] Built target gmock
Scanning dependencies of target gmock_main
[ 71%] Building CXX object test/googletest-release-1.8.1/googlemock/CMakeFiles/gmock_main.dir/src/gmock_main.cc.obj
[ 78%] Linking CXX static library libgmock_main.a
[ 78%] Built target gmock_main
Scanning dependencies of target gtest_win_test
[ 85%] Building CXX object test/CMakeFiles/gtest_win_test.dir/__/src/src/swap.cpp.obj
[ 92%] Building CXX object test/CMakeFiles/gtest_win_test.dir/test_swap.cpp.obj
[100%] Linking CXX executable gtest_win_test.exe
[100%] Built target gtest_win_test

D:\Projects\gtest181\gtest_win\build>

可以看到
[ 21%] Built target gtest_win 表示生成了gtest_win.exe可执行程序
[100%] Built target gtest_win_test 表示生成了gtest_win_test.exe可执行程序

五、执行测试

因为我们的测试程序是测试程序的子工程,所以编译之后,在build目录下只看到gtest_win.exe,

并没有看到gtest_win_test.exe,我们需要cd test进入test目录,才看到gtest_win_test.exe程序,

输入gtest_win_test.exe执行该测试程序,就可以开始测试了:

D:\Projects\gtest181\gtest_win\build>cd test

D:\Projects\gtest181\gtest_win\build\test>gtest_win_test.exe
Running main() from D:\Projects\gtest181\gtest_win\test\googletest-release-1.8.1\googletest\src\gtest_main.cc
[==========] Running 1 test from 1 test case.
[----------] Global test environment set-up.
[----------] 1 test from SWAP_TEST
[ RUN      ] SWAP_TEST.SWAP_TWO_INT
[       OK ] SWAP_TEST.SWAP_TWO_INT (0 ms)
[----------] 1 test from SWAP_TEST (5 ms total)

[----------] Global test environment tear-down
[==========] 1 test from 1 test case ran. (19 ms total)
[  PASSED  ] 1 test.

D:\Projects\gtest181\gtest_win\build\test>

在这里插入图片描述

六、总结

到此,在windows下使用gtest和cmake进行构建和编译执行测试的工程完成了,跟linxu下的差不多,如果使用VS构建,需要CMAKE构建生成MSCV工程,然后使用VS打开进行编译,本篇使用VSCODE,可以参考。

七、源码获取

本例程的源码可到此下载:https://github.com/TonsenWei/gtest_win

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

gtest使用入门(6)-win下使用vscode和cmake构建 的相关文章

  • 如何在cmake中静态链接到glibc

    我正在尝试从 Fedora 构建一个可以在 RedHat 6 机器上运行的包 所以我需要构建和静态链接一些RedHat机器中不存在的库 我发现我可以你 static libgcc or static libstdc 与标准库的静态版本链接
  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • 如何从 Visual Studio 将视图导航到其控制器?

    问题是解决方案资源管理器上有 29 个项目 而且项目同时具有 ASP NET MVC 和 ASP NET Web 表单结构 在MVC部分中 Controller文件夹中有大约100个子文件夹 每个文件夹至少有3 4个控制器 视图完全位于不同
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • -webkit-box-shadow 与 QtWebKit 模糊?

    当时有什么方法可以实现 webkit box shadow 的工作模糊吗 看完这篇评论错误报告 https bugs webkit org show bug cgi id 23291 我认识到这仍然是一个问题 尽管错误报告被标记为RESOL
  • 如何在 C++ 中标记字符串?

    Java有一个方便的分割方法 String str The quick brown fox String results str split 在 C 中是否有一种简单的方法可以做到这一点 The 增强分词器 http www boost o
  • 需要帮助优化算法 - 两百万以下所有素数的总和

    我正在尝试做一个欧拉计划 http projecteuler net问题 我正在寻找 2 000 000 以下所有素数的总和 这就是我所拥有的 int main int argc char argv unsigned long int su
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • C++ 中的 include 和 using 命名空间

    用于使用cout 我需要指定两者 include
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern
  • 类型或命名空间“MyNamespace”不存在等

    我有通常的类型或命名空间名称不存在错误 除了我引用了程序集 using 语句没有显示为不正确 并且我引用的类是公共的 事实上 我在不同的解决方案中引用并使用相同的程序集来执行相同的操作 并且效果很好 顺便说一句 这是VS2010 有人有什么
  • Mono 应用程序在非阻塞套接字发送时冻结

    我在 debian 9 上的 mono 下运行一个服务器应用程序 大约有 1000 2000 个客户端连接 并且应用程序经常冻结 CPU 使用率达到 100 我执行 kill QUIT pid 来获取线程堆栈转储 但它总是卡在这个位置
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat

随机推荐

  • Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)

    原文地址 http blog csdn net congcong68 article details 41113239 互联网的发展 网站应用的规模不断扩大 常规的垂直应用架构已无法应对 分布式服务架构以及流动计算架构势在必行 Dubbo是
  • Java的多重循环和程序调试

    1 掌握Java二重循环 多重 嵌套 注意 外层循环控制行 内层循环控制列 每行打印的内容 外层循环执行一次 内层循环执行一遍 一般多重循环值的就是二重循环 2 使用跳转语句控制程序的流程 return结束程序 结束当前的方法 返回到方法的
  • 补偿策略-刷新创建失败的禅道工单

    背景 当平台创建工单时需要将数据同步到第三方 由于某些原因 如网络延迟没有收到响应 但平台工单需要正常创建 此时需要创建异步补偿策略 1 创建补偿任务 Slf4j public class QueryZenTaoRunable extend
  • 分布式事务的几种解决方案

    一 基础概念 1 什么是事务 事务可以看做是一次大的活动 它由不同的小活动组成 这些活动 要么全部成功 要么全部失败 2 本地事务 在计算机系统中 更多的是通过 关系型数据库来控制事务 这是利用数据库 本身的事务特性来实现的 因此叫 数据库
  • 【干货】Redis在Java开发中的基本使用和巧妙用法

    Redis是一款高性能的内存数据结构存储系统 能够支持多种数据结构类型 如字符串 哈希 列表 集合 有序集合等 也能够支持高级功能 如事务 发布 订阅 Lua脚本等 具有高可用性 高并发性和可扩展性的优点 在Java开发中 Redis可以作
  • Javascript编程语言-现代模式,“use strict“,变量,命名变量,常量,保留字

    现代模式 use strict 长久以来 JavaScript 不断向前发展且并未带来任何兼容性问题 新的特性被加入 旧的功能也没有改变 这么做有利于兼容旧代码 但缺点是 JavaScript 创造者的任何错误或不完善的决定也将永远被保留在
  • sqlmap的使用 (以封神台题目为例)

    一 sqlmap选项 目标 至少要选中一个参数 u URL url URL 目标为 URL 例如 http www site com vuln php id 1 g GOOGLEDORK 将谷歌dork的结果作为目标url 请求 这些选项可
  • Linux— 网络编程套接字

    目录 预备知识 认识端口号 理解源端口号和目的端口号 认识TCP协议 认识UDP协议 网络字节序 socket编程接口 socket 常见API sockaddr结构 sockaddr 结构 编辑 sockaddr in 结构 in add
  • C++ 多线程编程(一)- C++11中的线程类

    C 多线程编程 一 C 11中的线程类 1 C 11 多线程编程库 2 线程的创建 2 1 初始化构造函数 2 2 移动构造函数 3 线程的基本操作 3 1 join 阻塞 等待线程结束 3 2 detach 分离线程 1 C 11 多线程
  • 腾讯云时序数据库 CTSDB 开放公测

    欢迎大家前往云 社区 获取更多腾讯海量技术实践干货哦 作者 李晓慧 近日 腾讯云推出云上时序数据库CTSDB Cloud Time Series Database CTSDB 是一款分布式 可扩展 高可靠的时序数据库 适用于有海量时序数据的
  • 数组的常用方法总结

    获取指定数组的长度 arr length console log a b c length 3 通常情况下 如果想判断一个数组是否为空 可以通过数组的长度是否为零来判断 数组和字符串的相关转换 2 1 数组转换为字符串 console lo
  • HW SR505红外传感器模块 一直输出高电平

    重点 1 505检测的是物体移动 不是前面是否有人 如果一个人一动不动也是不会检测出来的 2 505的正脚必须接5v 如果接3 3v则会不灵敏 505输出脚高电平总是3 3v 如果out引脚一直输出高电平试一下接 5v 3 505输出一次高
  • 主业外的第二副业选什么比较好,适合普通人的坚持之路

    说到副业 可能大部分人觉得不知道应该做什么 只是因为在物质日益高涨的今天 单单靠上班的一份工资已经不足以实现自己的一些人生规划了 上班永远是别人给你的职位 随时可以让你失去它 真正的经济自由是靠自己 所以需要在工作之余发展一份自己的副业 来
  • linux系统 InfluxDB安装及配置,修改数据路径,傻瓜教程

    linux系统磁盘挂载教程 linux服务器磁盘挂载 新手手把手教学 傻瓜式教程 风电猿的博客 CSDN博客 START 1 安装包下载 提供1 8 0版本的Influxdb安装包 百度网盘 请输入提取码 qlyx 2 安装指令 yum l
  • 关于maven仓库中的_remote.repositories

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 问题描述 既然有这个jar包为什么还会报错呢 无意间通过dependency tree命令查看依赖 发现 这说明 core common jar包依赖paas thirdp
  • Node.js-Gulp的使用

    概述 Gulp 是基于 Node 平台开发的前端构建工具 主要用来设置程序自动处理静态资源的工作 通过 Gulp 能自动化地完成 html css javascript less sass image 等文件的测试 检查 合并 压缩 格式化
  • 单个按键控制数码管显示数字(2)

    一 主要功能 单个按键控制数码管显示数字 二 代码实现 代码如下 include
  • Unity3D实现简单的血条功能

    在游戏中血条是一个很常见的东西 它可以直观的显示血量 在很多地方都有运用 尤其是小兵或者怪物身上 那么该怎样去制作一个简单的血条呢 其实很简单 血条就是一个UI而已 用一张长条形的图片即可实现 具体操作如下 1 先创建一个3D的物体命名为P
  • web项目----实现简单的增删查改

    本人稀土掘金地址 coding Rayce 的个人主页 动态 掘金 juejin cn 首先了解javaEE的三层架构 由图中我们可以看出 javaEE的三层架构严格的规定了项目中的每个模块 每个层需要完成的事情 这样会使项目的变得非常简洁
  • gtest使用入门(6)-win下使用vscode和cmake构建

    文章目录 概述 一 环境准备 二 源码准备 三 准备googletest源码和测试代码 四 构建并编译源码和测试代码 五 执行测试 六 总结 七 源码获取 概述 最近尝试在windows下使用googletest 并使用CMake进行构建