linux 中 C++的环境搭建以及测试工具的简单介绍
文章目录
-
- makefle
- CMake
- gdb调试 与 coredump
- Valgrind 内存检测
- gtest 单元测试
makefile 介绍
安装 : sudo apt install make
makefile 的规则: 举例说明
包括:目标文件 、 依赖文件 、 生成规则
使用 : make
make clean
CMake :
CMake是一个跨平台的构建工具,用于管理和生成C++项目的构建过程。它可以自动生成Makefile、Visual Studio项目文件、Xcode项目文件等,极大地简化了源代码跨平台构建的过程。
安装 : sudo apt-get install cmake 。
linux 中使用 CMake 生成 Makefile 并编译流程
- 编写CMake 配置文件 CMakeList.txt .
- 执行命令 cmake PATH 生成 Makefile 其中 PATH 是 CMakeList.txt所在的目录
-使用 cmake 命令进行编译
CMakeLists.txt 文件示例:
#CMakeLists.txt 基础用法#CMake 最低版本要求
cmake_minimum_required(VERSION 3.27.4)#项目信息
project(project.exe)#指定生成的文件
add_executable(CMake project.exe project.c speak.c)
执行 cmake . (会在当前文件下 ,生成一个Makefiles )
gdb调试 与 coredump
gdb 是linux 程序员的一大利器
安装 sudo apt-get install gdb
使用前提: 文件编译的时候 带上 -g
gcc -g project.c -o project.exe
启动:
gdb project.exe
gdb 常用命令
- 获取帮助 hlep
- break 设置断点 , 命令接收行号 或者函数作为参数
- info break 可以查看断点
- clear 可以清除断点
- run 运行程序到达中断处
-next 命令(缩写 n ) 单步执行 可以指定数字 n 1(其他的都可以)
-continue 命令(缩写 c ) 想要继续执行 , 直到遇到下一个断点
- print (缩写 p ) 监视变量
- 临时修改变量 命令 set var 如set var a= 100
- bt 查看堆栈情况
Coredump 调试
在程序运行过程中出现严重错误导致程序崩溃时,操作系统将程序的内存状态保存到一个特殊的文件中,以便进行后续的调试和分析。
当程序发生错误时,操作系统会默认生成一个core文件,其中包含了程序崩溃时的内存状态、寄存器值、堆栈信息等。这个core文件可以被调试器工具(如gdb)加载,用于分析程序崩溃的原因。
前期设置:
- 1 . 设置core 文件的生成的目录 , 其中%e表示程序文件名 , %p 表示进程的ID ,
如果不设置,那么会在当前目录生成 core 文件
方法: echo /data/coredump/core.%e.%p > /proc/sys/kernel/core_pattern
我们要确保 data 和 coredump存在 , mkdir 自己创建一个,你也可以放在其他文件下
我这里放在了 / 根目录下
使用cat 查看core的生成目录
- 2 . 将生成的 core 改成不受限制 ulimit -c unlimited
什么情况下会导致程序异常退出:
- 非法指针的访问 ,堆栈溢出
如何调试:
1> 编译时添加 -g 选项 ,增加调试信息
2> gdb project.exe core core_file (core文件的目录)
- bt 或者 where 查看调用栈的信息
- 查看某一层的信息 frame n (n 从0开始 , frame 0 表示栈顶)
- up n 上移n 层
-down n 下移
- info frame 查看当前层的信息
- info args 查看当前函数的参数名及其值
- info locals 打印当前函数中所有局部变量及其值
内存检测 Valgrind
检测和调试程序的开源工具。
它主要用于发现和分析内存泄漏、访问越界、使用未初始化的变量等常见的程序错误。
使用Valgrind可以帮助开发人员在早期发现和解决潜在的内存错误,提高代码的质量和可靠性。
安装: sudo apt-get install valgrind
Memcheck 检查步骤
1. 编译时带上 -g
2. 执行 :
valgrind --tool=memcheck --leak-check ./you program
部分结果分析
-
"All heap blocks were freed -- no leaks are possible": 这表示程序在退出之前已经正确释放了所有的堆内存,并且没有内存泄漏。
-
"ERROR SUMMARY: n errors from m contexts": 这表示Valgrind检测到n个内存错误,并且这些错误发生在m个上下文中。Valgrind会提供更详细的错误信息,以便你能够定位和修复这些问题。
-
"Invalid read/write of size n": 这表示程序尝试读取或写入大小为n的内存块,但该内存块的访问是无效的。可能存在越界访问、空指针解引用等问题。
-
"Conditional jump or move depends on uninitialised value(s)": 这表示程序在条件分支或移动操作中使用了未初始化的值。这可能导致不可预测的行为。
-
"Invalid free/delete": 这表示程序尝试释放一个无效的内存块。通常是因为重复释放、野指针等问题。
gtest 单元测试
用于C++的流行单元测试框架,可以帮助你编写和运行自动化的单元测试代码
搭建测试框架:
下载方法 : git clone https://github.com/google/googletest.git
1 cd googletest
2 cmake ./
3 make
最后 sudo make install 大功告成
测试demo:
demo1.h
#ifndef _DEMO1_H_
#define _DEMO1_H_int factorial(int n);#endif // _DEMO1_H_
~
demo1.cc
#include "demo1.h"int factorial( int n){int result = 1;for( int i=1 ;i<=n; i++){result *=i;}return result;
}
~
接下来,我们测试factorial 函数是否正确 ,编写一个测试用例 demo1_main.cc
#include <limits.h>
#include "demo1.h"
#include "gtest/gtest.h"namespace{TEST( factorialTest ,Negative ){//负数EXPECT_EQ(1 , factorial(-5));EXPECT_EQ( 1 , factorial(-1));EXPECT_GT( factorial(-10) , 0);}TEST(factorialTest , Zero){EXPECT_EQ( 1 , factorial(0));
}TEST( factorialTest , Positive){EXPECT_EQ(1 , factorial(1));EXPECT_EQ(2 , factorial(2));EXPECT_EQ(6 , factorial(3));EXPECT_EQ(40320 , factorial(8));
}} //namespace
~
说明:
- 1、 TEST 是 gtest 的测试宏 ,我们的测试用例必须这样写
- 2、factorialTest 是测试套的名字 ,一个测试套可以包含多个测试用例
- 3、 EXPECT_EQ 、EXPECT_GT 等等都是 gtest 提供的测试断言
- 4、EXPECT_EQ 会返回成功,或者失败 ,既我们测试用例的成功或者失败
- 5编译:
g++ demo1.cc demo1_main.cc -lgtest -std = c++11 -lgtest_main -lpthread -o demo
- 6 、 执行 ./demo
如果全部是绿色的· , 那么恭喜你,写的方法可能没有问题。
相关文章:
linux 中 C++的环境搭建以及测试工具的简单介绍
文章目录 makefleCMakegdb调试 与 coredumpValgrind 内存检测gtest 单元测试 makefile 介绍 安装 : sudo apt install make makefile 的规则: 举例说明 包括:目标文件 、 依赖文件 、 生成规则 使用 : make make clean CMake : CMake是一个…...
448. 找到所有数组中消失的数字
找到所有数组中消失的数字 描述 : 给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字,并以数组的形式返回结果。 题目 : LeetCode 448. 找到所有数组中消失的数字: 448. 找…...
为何在下雪天它“失宠”了,传统雪地靴居然不适合下雪穿
随着冬至的到来,一年之中最寒冷的“三九天”正式拉开序幕。近期各地纷纷下起了大雪,在这场大雪中雪地靴似乎“失宠”了。在社交媒体上,有网友吐槽“雪地靴根本不能下雪穿”,后面有不少网友纷纷分享了自己在雪地靴上尴尬的经历&…...
第34节: Vue3 调用内联处理程序中的方法
在UniApp中使用Vue3框架时,你可以在模板中直接调用组件内联处理程序中的方法。以下是一个示例: <template> <view> <button click"handleClick">Click me</button> <p>{{ message }}</p> </view&…...
JavaScript--明明白白Promise (Park One)
明明白白Promise (Park One) Promise是一种用于处理异步操作的特殊对象。它代表了一个尚未完成但最终会完成的操作,并可以在操作完成后返回结果或错误。 Promise有三种状态:pending(进行中)、fulfilled(已完成&#…...
el-form与el-upload结合上传带附件的表单数据(后端篇)
1.写在之前 本文采用Spring Boot MinIO MySQLMybatis Plus技术栈,参考ruoyi-vue-pro项目。 前端实现请看本篇文章el-form与el-upload结合上传带附件的表单数据(前端篇)-CSDN博客。 2.需求描述 在OA办公系统中,流程表单申请人…...
postMessage——不同源的网页直接通过localStorage/sessionStorage/Cookies——技能提升
最近遇到一个问题,就是不同源的两个网页之间进行localstorage或者cookie的共享。 上周其实遇到过一次,觉得麻烦就让后端换了种方式处理了,昨天又遇到了同样的问题。 使用场景 比如从网页A通过iframe跳转到网页B,而且这两个网页…...
上市公司-绿色投资者数据集(2000-2022)
上市公司-绿色投资者数据(2000-2022年)是一份涵盖了过去二十多年中国上市公司绿色投资情况的详细数据集。该数据集包括了各上市公司的股票代码、年份、会计年度、股票简称,以及STPT(特殊处理股票的标识),行…...
3 pandas之dataframe
定义 DataFrame是一个二维数据结构,即数据以行和列的方式以表格形式对齐。 DataFrame特点: 存在不同类型的列大小可变带有标签的轴可对列和行进行算数运算 构造函数 pandas.DataFrame( data, index, columns, dtype, copy)参数解释: 序号…...
vue-内网,离线使用百度地图(地图瓦片图下载静态资源展示定位)
前言 最近发现很多小伙伴都在问内网怎么使用百度地图,或者是断网情况下能使用百度地图吗 后面经过一番研究,主要难点是,正常情况下我们是访问公网百度图片,数据,才能使用 内网时访问不了百度地图资源时就会使用不了&…...
OpenFeign 万字教程详解
OpenFeign 万字教程详解 目录 一、概述 1.1.OpenFeign是什么?1.2.OpenFeign能干什么1.3.OpenFeign和Feign的区别1.4.FeignClient 二、OpenFeign使用 2.1.OpenFeign 常规远程调用2.2.OpenFeign 微服务使用步骤2.3.OpenFeign 超时控制2.4.OpenFeign 日志打印2.5.O…...
全自动双轴晶圆划片机:半导体制造的关键利器
随着科技的飞速发展,半导体行业正以前所未有的速度向前迈进。在这个过程中,全自动双轴晶圆划片机作为一种重要的设备,在半导体晶圆、集成电路、QFN、发光二极管、miniLED、太阳能电池、电子基片等材料的划切过程中发挥着举足轻重的作用。 全自…...
Android Studio 安装和使用
前些天,打开了几年前的一个Android Studio app项目,使用安卓虚拟机仿真app崩溃,怀疑是不是中间升级过Android Studio导致异常的,马上脑子一热卸载了,结果上次踩过的坑,一个没少又踩一次,谨以此文…...
【已解决】Java中,判断:集合中是否包含指定元素(模糊匹配)比如权限中的user:list或者是user:*这种判断
背景描述 在工作中,有时候,我们需要对list中是否包含了指定元素进行判断,但是,有时候又需要支持模糊匹配,这个时候怎么办呢? 比如权限,我们知道,权限不仅可以配置完整的路径&#…...
【基于激光雷达的路沿检测用于自动驾驶的真值标注】
文章目录 概要主要贡献内容概述实验小结 概要 论文地址:https://arxiv.org/pdf/2312.00534.pdf 路沿检测在自动驾驶中扮演着重要的角色,因为它能够帮助车辆感知道可行驶区域和不可行驶区域。为了开发和验证自动驾驶功能,标注的数据是必不可…...
【Spring实战】配置多数据源
文章目录 1. 配置数据源信息2. 创建第一个数据源3. 创建第二个数据源4. 创建启动类及查询方法5. 启动服务6. 创建表及做数据7. 查询验证8. 详细代码总结 通过上一节的介绍,我们已经知道了如何使用 Spring 进行数据源的配置以及应用。在一些复杂的应用中,…...
DevOps系列文章 : 使用dpkg命令打deb包
创建一个打包的目录,类似rpmbuild,这里创建了目录deb_build mkdir deb_build目标 我有一个hello的二进制文件hello和源码hello.c, 准备安装到/opt/helloworld目录中 步骤 在deb_build目录创建一个文件夹用于存放我的安装文件 mkdir helloworld在he…...
linux sed命令操作大全
经常使用,但有些总记不全,有时候经常查找,这次全部捋清楚做备忘,有需要的小伙伴欢迎收藏起来哦! 查、增、改、删一应俱全,非常详细! 目录 一、查看 查看第2行 查看第2行到第3行 查看第1行、…...
Vue2+Vue3组件间通信方式汇总(3)------$bus
组件间通信方式是前端必不可少的知识点,前端开发经常会遇到组件间通信的情况,而且也是前端开发面试常问的知识点之一。接下来开始组件间通信方式第三弹------$bus,并讲讲分别在Vue2、Vue3中的表现。 Vue2Vue3组件间通信方式汇总(1)…...
前端基础location的使用
概念 获取当前页面的地址信息,还可以修改某些属性,实现页面跳转和刷新等。 样例展示 window.location 含义.originURL 基础地址,包括协议名、域名和端口号.protocol协议 (http: 或 https:).host域名端口号.hostname域名.port端口号.pathname路…...
Android JNI入门到基础
一、JNI项目创建 AS创建项目时选择NativeC 会创建一个基本的JNI项目 MainActivity中写java层的native方法 具体实现在cpp文件中 native-lib.cpp #include <jni.h> #include <string>extern "C" JNIEXPORT jstring JNICALL Java_com_cn_techvision_j…...
60.乐理基础-打拍子-V字打拍法
前置内容: 文字版 https://note.youdao.com/s/6FSSvGBf (顺序参考:下方的视频版里面目录顺序) 视频版 【四川音乐学院作曲硕士】教你零基础自学乐理保姆级教学-学习视频教程-腾讯课堂 文字版还有下图红框中三个专栏里的内容&a…...
列表对象的时间进行中文格式化处理
在黑马的项目学习中,如何将前端页面时间显示成2023年12月21日 06:23:23中文形式。 如果你想使用中文格式化日期,你可以将 en-US 更改为 zh-CN,以使用中文语言环境。以下是修改后的代码: result.data.items.forEach(item > {//…...
vi和vim的区别
目录 一、前言 二、vi/vim 的介绍 三、Vi/Vim 常见指令 四、vi和vim的区别 一、前言 写这篇文章的目的,是为了告诉大家我们如果要在终端下对文本进行编辑和修改可以使用vim编辑器。 Ubuntu 自带了 VI 编辑器,但是 VI 编辑器对于习惯了 Windows 下进…...
【昆明*线上同步】最新ChatGPT/GPT4科研实践应用与AI绘图技术及论文高效写作
详情点击查看福利:【昆明*线上同步】最新ChatGPT/GPT4科研实践应用与AI绘图技术及论文高效写作 目标: 1、熟练掌握ChatGPT提示词技巧及各种应用方法,并成为工作中的助手。 2、通过案例掌握ChatGPT撰写、修改论文及工作报告,提供…...
【解决Typora图片不是显示问题】PicGo+Github+Typora+ onedrive/坚果云 实现笔记同步
【解决Typora图片不是显示问题】PicGo、Github、Typora实现笔记同步 写在前面: typora笔记软件使用记录typora图片上传问题:原因分析:解决方案:PicGoGithubTypora 坚果云/onedrive 实现笔记同步第一步. 设置上传模式:u…...
使用Guava轻松创建和管理不可变集合
第1章:引言 大家好,我是小黑。今天,我们来聊聊一个在Java编程里超有用的话题:使用Guava创建和管理不可变集合。首先,咱们得明白,什么是不可变集合。简单来说,不可变集合就是一旦创建就不能被修…...
深入了解 Android 中的应用程序签名
深入了解 Android 中的应用程序签名 一、应用程序签名介绍1.1 应用程序签名1.2 应用程序签名的意义1.3 应用程序签名的流程1.4 应用程序签名的方案1.5 签名的重要性和应用场景 二、AOSP 的应用签名2.1 AOSP的应用签名文件路径2.2 应用程序指定签名文件 三、Android Studio 的应…...
说说 style gan 中的感知路径长度(Perceptual Path Length)
我在之前的博库中介绍了 style gan 的基本原理,原文中有提出感知路径长度(Perceptual Path Length)的概念。这是一种评价生成器质量的方式。 PPL基本思想:给出两个随机噪声 z 1 , z 2 ,为求得两点的感知路径长度PPL…...
基于JAVA的厦门旅游电子商务预订系统 开源项目
目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 景点类型模块2.2 景点档案模块2.3 酒店管理模块2.4 美食管理模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 学生表3.2.2 学生表3.2.3 学生表3.2.4 学生表 四、系统展示五、核心代码5.1 新增景点类型5.2 查询推荐的…...
苹果网站用flash做/上海seo顾问
第二章:SVM(支持向量机) - 理论文档中的代码错误值2。欢迎来到监督式机器学习的第二块踏脚石。本章再次分为两部分。第1部分(这一部分)讨论了理论,工作和调整参数。第2部分(这里)我们…...
哈尔滨建设网站的免费咨询/跨境电商网站开发
试验网站#1搜索引擎优化收录情况记录(断续运行)日期Yahoogooglebaidusogou每日收录每日收录增量每日收录每日收录增量每日收录每日收录增量每日收录每日收录增量2007-6-24288 333 1060 4813 2007-6-25164013523330108020481302007-6-26空间超过6月流量限制……,…...
品牌餐饮加盟网站建设/油烟机seo关键词
IT在短短的十几年内,已经成为我国重要的经济增长点,国家更是大力扶持。目前,IT产业已经进入全产业IT化的时代,各个行业都在IT化、互联网化、信息化,这意味着你只要掌握了IT技术,就业范围将不会仅限于IT互联…...
建设网站需要什么设备/乐陵seo外包
本教程向您展示如何将数据从 Elasticsearch 导出到 CSV 文件。 想象一下,您想要在 Excel 中打开一些 Elasticsearch 中的数据,并根据这些数据创建数据透视表。 这只是一个用例,其中将数据从 Elasticsearch 导出到 CSV 文件将很有用。 方法一 …...
韶关企业网站建设公司/精准营销名词解释
回到目录 一些概念 在大叔框架里总觉得缺点什么,在最近的项目开发中,终于知道缺什么了,分布式文件存储组件,就是缺它,呵呵,对于分布式文件存储来说,业界比较公认的是FastDFS组件,它自…...
哪家网络公司做网站好/友情链接的形式有哪些
前言 前后端分离架构下,如何实现请求调用? 本文就此问题就行了初步的探究。 在前后端分离的情况下,目前主流技术是通过 axios发起请求。 Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。 主要功能 从浏览器…...