Linux开发环境配置(下)
✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿
🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟
🌟🌟 追风赶月莫停留 🌟🌟
🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀
🌟🌟 平芜尽处是春山🌟🌟
🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟
🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅
🍋Linux开发环境配置
- 🍑Linux编译器--gcc/g++使用
- 🍍程序执行
- 🍍预处理
- 🍍编译
- 🍍汇编
- 🍍链接
- 🍍动态库和静态库
- 🍑Linux调试器--gdb使用
- 🍍背景
- 🍍相关指令
- 🍑自动化构建工具--make/Makefile
- 🍍背景
- 🍍应用实例
🍑Linux编译器–gcc/g++使用
前面我们已经完成了vim的配置,接下来我们就要正式学习如何编译代码了,无论是C语言还是c++、java等计算机语言,在vim下编译,都要先在安装该指令,前面我们介绍的是Linux为cenos7版本现在我们是在ubuntu中,两者大径相同安装指令也差不多。如:安装c++语言编译器
yum install -y gcc-c++ //cenos7版本下
apt install -y gcc-c++ //ubuntu版本下
在Linux中gcc/g++执行指令:
gcc + -o + 指定文件名 + 原文件名 //c执行指令
g++ + -o + 指定文件名 + 原文件名 //c++执行指令
🍍程序执行
如上图中,test.c是提前写好的C语言程序文件,当我们使用gcc执行指令时间,系统会给我们生成一个绿色标注的文件,这个就是可执行文件。
当我们运行该可执行文件,就会打印输出我们提前准备好的信息。
🍍预处理
预处理是g++编译过程的第一步,它主要处理源代码中的伪指令(以#开头的指令,如宏定义、条件编译指令、包含指令等)和特殊符号。经过预处理过程后,会生成一个没有宏定义,没有条件编译指令、没有特殊符号(除了编译器需要的#pragma指令)的输出文件(通过以 .i 作为文件拓展名)。
在程序进行中查看预处理的指令:
gcc + -E + 原.c文件名 + -o + 定义.的i文件名
当我们输入执行指令后,会生成.i的文件,.i 文件就是预处理代码在此文件中,如下图,并且程序运行预处理阶段会自动停下来。
🍍编译
该阶段是编译过程的第二个阶段,它将预处理后的代码转换成汇编语言。在这个阶段,编译器会进行词法分析、语法分析、语义分析以及优化等操作。最终,编译器会生成一个汇编语言文件(通常以 .s 作为文件拓展名)。
在程序中查看编译阶段的指令:
gcc -S 原有的 .i 文件 + -o + 新定义的 .s 文件名
当我们输入编译指令时,系统会生成 .s 为拓展名的文件,该文件是存储编译阶段的汇编代码,如下图
🍍汇编
该阶段是编译过程中的第三个阶段,它将编译阶段生成的汇编语言文件转换成二进制格式的目标文件,这个过程涉及到将汇编指令翻译成机器指令,并生成最终可以在计算机上执行的代码。
在程序中查看汇编阶段的指令:
gcc + -c + 原.s文件 + -o 新定义.o文件名
当我们输入汇编执行指令,系统会生成一个以 .o 作为拓展名的文件,它里面是将汇编代码转换成二进制形式,所以我们看到的是乱码形式,如下图。
🍍链接
该阶段是编译过程中的第四个阶段,也是最后一个阶段。它主要将编译阶段和汇编阶段生成的目标文件以及所需的库文件组合成一个可执行文件。在这个过程中,链接器会解决所有符号引用,并将所有相关的代码和数据合并到一个文件中,使其能够在计算机上运行。
在程序中查看链接阶段的指令:
gcc + 原.o文件名 + -o + 新定义文件名
当我们输入链接执行指令,系统会生成一个test标绿的文件,这就是可执行文件,可以运行,如下图
🍍动态库和静态库
动态库是动态链接的库,动态库又被称为共享库,这是因为动态库中的内容是被所有程序共享的,就类似于一个功能块的程序,谁需要谁就可以调用它。gcc进行函数库的链接时可以选择静态链接还是动态链接,但是在Linux中系统默认是动态链接。
file是可以查看该文件的链接情况,也可以使用 ldd+文件名 来查看,只不过file查看的信息更详细,如下图
上图中libc.so是动态链接的标志,其中lib是前缀, .so是后缀,去掉前缀和后缀,最后为c,可以看出该文件调用的是C语言共享库,及动态链接。
静态库是采用静态链接的方式;静态链接不同于动态链接共享的方式,如果调用静态库,会将自己所需要的代码拷贝至程序中,完成拷贝后,后续将不需要再调用静态库。
如果想采用静态库的链接形式编译程序,需要再编译时加上-static选项,当然前提得有静态库,没有的话可以通过
apt install -y glibc-static
该指令下载静态库,当然我们也可以利用ldd 来查看文件是否为静态链接,如下图。
在实际过程中,动态库和静态库各有各的优点和缺点。
静态库
- 优点:不依赖库,同类型平台中都可以直接运行使用。
- 缺点: 可执行程序体积比较大,比较浪费资源、内存、网络等资源。
动态库:
- 优点: 节省资源,不会出现太多的重复代码。
- 缺点: 对库的依赖性较强,一旦库丢失,所有使用这个库的程序都无法运行。
🍑Linux调试器–gdb使用
🍍背景
gdb是GNU开源组织发布的一个强大的命令行调试工具,它在Linux操作系统下主要用于调试,使用多种编程语言(如C、C++、Java、Python等)编写的程序。GDB是一个功能强大的程序调试工具,它可以帮助开发人员更快地定位和修复程序中的缺陷,提高代码质量和开发效率。
GDB具有众多功能:
启动程序:GDB可以启动被调试的程序,并按照用户自定义的方式运行程序。
设置断点:用户可以在程序中任何需要的地方设置断点,当程序运行到这些断点时,会自动暂停执行,以便用户进行调试。
查看程序状态:在程序暂停时,用户可以查看程序的运行状态,包括变量值、寄存器内容、内存值以及堆栈信息等。
单步执行:GDB支持逐语句和逐过程两种单步执行方式,用户可以选择进入函数内部进行详细调试,也可以选择直接调用函数而不进入其内部。
修改程序:在调试过程中,用户还可以修改程序中的变量值或执行顺序,以验证程序的正确性。
使用该调试工具时,需要提前下载好:
sudo apt install -y gdb
🍍相关指令
指令 | 含义 |
---|---|
l+行号 | 显示指定行之后的代码(gdb会自动记录最后一条指令) |
b+行号/函数名/file:行号 | 对指定位置打断点 |
info+行号 | 查看我们所打的断点 |
d+断电编号 | 删除断点 |
disable/enable+断电编号 | 使能(禁用/开启)断电 |
n | 逐过程,也就vs调试中的F10(类似于逐行语句调试) |
s | 逐语句,也就vs调试中的F11(类似于能进入函数调试) |
p+变量 | 显示变量的内容和地址(可以查看变量的大小) |
display+变量名/变量地址 | 常显示 |
undisplay+编号 | 取消常显示变量的内容和地址 |
c | 从一个断电到下一个断电(范围查找) |
bt | 查看调用堆栈 |
finish | 将一个函数运行结束,就停下来(范围查找) |
until+行号 | 在一个范围内,直接运行到指定行(范围查找) |
🍑自动化构建工具–make/Makefile
🍍背景
在Linux系统中,自动化构建项目是提高开发效率、减少重复劳动的关键环节。其中,make工具和其配置文件Makefile是实现这一目标的重要工具组合。
make是一个在Linux下广泛使用的自动化构建工具,它可以根据一个Makefile文件中的指令来自动执行编译、链接等操作,从而生成一个可执行文件或者库文件。make工具通过读取Makefile文件(或makefile,不区分大小写),并根据文件中的指令执行相应的命令,这些命令通常包括编译、链接等,用于生成最终的可执行文件或库文件。
Makefile是一个文本文件,它包含了一系列的规则(rules)、目标(targets)、依赖(dependencies)和命令(commands)。每个规则定义了一个目标文件(通常是编译或链接的结果),以及生成该目标文件所需的依赖文件和要执行的命令。
🍍应用实例
make指令要搭配文件Makefile使用,两者缺一不可。
我根据test.c文件对大家进行实例演示:
- 创建Makefile文件
- 对test.c文件进行Makefile代码编写
上述图中,代码的含义是test可执行文件依靠的是test.c文件,而下面那行代码就是".c"文件生成".o"的可执行文件。
- 执行make
上面几步就是一个简单Makefile文件代码的编写,在实际使用该工具时,不会那么简单,既然有生成该可执行文件,那有没有删除的呢?
上述图中我间接使用了".PHONY"来执行clean,".PHONY"是一个伪目标,是Makefile文件中的一个关键字,意思为某个对象生成伪目标,这样就能在不对的源文件进行修改,重复执行任务了。
Makefile文件对make指令来说,第一个执行目标往往是优先权,仅仅只会执行主目标,也就是从上往下数的第一个执行目标,剩下的目标要执行就需要使用伪目标。
还有另外一种实际使用情况,现在这里是仅生成一个可执行文件,当我们需要同时能生成多个可执行文件时,就需要使用Makefile文件的另一个关键字"all","all"的意思大家都知道是全部的含义,所以在这里就是让make能够同时执行全部的目标文件,并且目标文件为test和today,如下图:
关于本章知识点如果有不足或者遗漏,欢迎大家指正,谢谢!!!
相关文章:

Linux开发环境配置(下)
✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ 🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿…...

系统开发常用命令合集
本文还会持续更新,大家可以点赞收藏~ ifconfig ifconfigwlan0表示无线网络接口 eth0表示以太网接口(有线) HWaddr是接口的物理地址(MAC地址) inet addr是接口的IPv4地址 Bcast是广播地址,Mask是子网掩码 …...

Termius工具在MAC的使用出现的问题:
Termius工具在MAC的使用出现的问题: 在使用SFTP时,出现不了本地的文件的位置 解决方案: 在Apple store下载的使用不了LOCAL SFTP, 需要在网页上进行下载才可以: 官网下载地址:https://termius.com/down…...
浅析Android中View的绘制流程
前言 在《浅析Android中View的测量布局流程》中分析了VSYNC信号到达App进程之后开启的View布局过程,经过对整个View树进行遍历进行测量和布局,最终确定View的大小以及在屏幕中所处的位置。但是如果用户想在屏幕上看到View的内容还需要经过绘制来生成图形…...

pikachu靶场- 文件上传unsafe upfileupload
pikachu靶场- unsafe upfileupload 概述client checkMIME typegetimagesize() 概述 不安全的文件上传漏洞概述 文件上传功能在web应用系统很常见,比如很多网站注册的时候需要上传头像、上传附件等等。当用户点击上传按钮后,后台会对上传的文件进行判断…...
java中this的内存原理是?
在Java中,this关键字是一个特殊的引用,指向当前对象的实例。它在以下几个方面发挥重要作用: 指向当前对象:this可以用来访问当前对象的属性和方法,尤其在参数命名与实例变量重名时,用于区分。 构造函数&a…...

Matlab 车牌识别技术
1.1设计内容及要求: 课题研究的主要内容是对数码相机拍摄的车牌,进行基于数字图像处理技术的车牌定位技术和车牌字符分割技术的研究与开发,涉及到图像预处理、车牌定位、倾斜校正、字符分割等方面的知识,总流程图如图1-1所示。 图1-1系统总…...

CUDA-求最大值最小值atomicMaxatomicMin
作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 实现原理 atomicMax和 atomicMin是 CUDA 中的原子操作,用于在并行计算中安全地更新共享变量的最大值和最小值。它们确…...

新的Midjourney就是一个增强版的Photoshop,你现在可以轻松的用它换衣服、换发型了
好久没有聊 Midjourney 了,昨晚他们发布了一项引人注目的新功能:AI 图像编辑,一个基于网页的加强版的 Photoshop 呼之欲出,让我大为震撼,也让用户们赞叹不已。 基于现有图像进行参考,进而生成新的图片&…...
Linux系统安装软件的4种方式【源码配置编译安装、yum安装、rpm包安装、二进制软件包安装(.rpm/.tar.gz/.tgz/.bz2)】
一.源码安装 linux安装软件采用源码安装灵活自由,适用于不同的平台,维护也十分方便。 (一)源码安装流程 源码的安装一般由3个步骤组成: 1.配置(configure) Configure是一个可执行脚本…...

基于Spring Boot的洪涝灾害应急信息管理系统设计与实现
摘要 近年来,全球气候变化加剧,洪涝灾害频发,给各国的经济发展和人民生活带来了巨大的威胁。为了提高洪涝灾害的应急响应能力,开发高效的应急信息管理系统变得至关重要。本文基于Spring Boot框架,设计并实现了一个洪涝…...
912.排序数组(桶排序)
目录 题目解法 题目 给你一个整数数组 nums,请你将该数组升序排列。 你必须在 不使用任何内置函数 的情况下解决问题,时间复杂度为 O(nlog(n)),并且空间复杂度尽可能小。 解法 class Solution { public:vector<int> sortArray(vect…...

IPC 进程间通信 消息队列
操作系统内核中采用一个链式队列管理消息,每个节点就对应一个消息: 操作系统规定了单个消息的数据长度不能超过8k(8192个字节),一个消息队列的表长(节点数)最多不超过256个 利用消息队列进行通信的特点: 1. 全双工:任何参与通信的…...

opencv 图像翻转- python 实现
在做图像数据增强时会经常用到图像翻转操作 flip。 具体代码实现如下: #-*-coding:utf-8-*- # date:2021-03 # Author: DataBall - XIAN # Function: 图像翻转import cv2 # 导入OpenCV库path test.jpgimg cv2.imread(path)# 读取图片 cv2.namedWindow(image,1) …...

使用DolphinScheduler接口实现批量导入工作流并上线
使用DS接口实现批量导入工作量并上线脚本 前面实现了批量生成DS的任务,当导入时发现只能逐个导入,因此通过接口实现会更方便。 DS接口文档 DS是有接口文档的地址是 http://IP:12345/dolphinscheduler/swagger-ui/index.html?languagezh_CN&lang…...
pycharm导出环境安装包列表
pycharm导出环境安装包列表 一、导出安装包列表二、安装requirements.txt三、列表显示已安装的包四、显示特定包的信息 一、导出安装包列表 pip freeze > requirements.txt二、安装requirements.txt pip install -r requirements.txt三、列表显示已安装的包 pip list四、…...

分体式智能网关在现代电力物联网中的优势有哪些?
随着电力系统的不断数字化和智能化,电力物联网已经成为现代电力行业发展的重要方向。电力物联网通过各种智能设备和传感器实现电力系统的监测、数据采集和分析,从而优化电力资源配置,提高电网的安全性和稳定性。在这个背景下,&quo…...

第14篇:下一代网络与新兴技术
目录 引言 14.1 下一代网络(NGN)的定义与特点 14.2 IPv6协议的改进与未来应用 14.3 软件定义网络(SDN) 14.4 网络功能虚拟化(NFV) 14.5 量子通信网络 14.6 软件定义广域网(SD-WAN&#x…...

物联网数据采集网关详细介绍-天拓四方
一、物联网数据采集网关的概述 物联网数据采集网关,简称数据采集网关,是物联网系统中的重要组成部分,位于物联网设备和云端平台之间。其主要职责是实现数据的采集、汇聚、转换、传输等功能,确保来自不同物联网设备的数据能够统一…...

2024软考网络工程师笔记 - 第10章.组网技术
文章目录 交换机基础1️⃣交换机分类2️⃣其他分类方式3️⃣级联和堆叠4️⃣堆叠优劣势5️⃣交换机性能参数 🕑路由器基础1️⃣路由器接口2️⃣交换机路由器管理方式2️⃣交换机路由器管理方式 交换机基础 1️⃣交换机分类 1.根据交换方式分 存储转发式交换(Store…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...

STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...

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

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能
1. 开发环境准备 安装DevEco Studio 3.1: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK 项目配置: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...
PostgreSQL——环境搭建
一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在࿰…...