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路…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...

【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...

Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...

HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...

k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...
32单片机——基本定时器
STM32F103有众多的定时器,其中包括2个基本定时器(TIM6和TIM7)、4个通用定时器(TIM2~TIM5)、2个高级控制定时器(TIM1和TIM8),这些定时器彼此完全独立,不共享任何资源 1、定…...
React父子组件通信:Props怎么用?如何从父组件向子组件传递数据?
系列回顾: 在上一篇《React核心概念:State是什么?》中,我们学习了如何使用useState让一个组件拥有自己的内部数据(State),并通过一个计数器案例,实现了组件的自我更新。这很棒&#…...