当前位置: 首页 > news >正文

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 来查看文件是否为静态链接,如下图。

在这里插入图片描述

在实际过程中,动态库和静态库各有各的优点和缺点。

静态库

  1. 优点:不依赖库,同类型平台中都可以直接运行使用。
  2. 缺点: 可执行程序体积比较大,比较浪费资源、内存、网络等资源。

动态库:

  1. 优点: 节省资源,不会出现太多的重复代码。
  2. 缺点: 对库的依赖性较强,一旦库丢失,所有使用这个库的程序都无法运行。

🍑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文件对大家进行实例演示:

  1. 创建Makefile文件
    在这里插入图片描述
  2. 对test.c文件进行Makefile代码编写

在这里插入图片描述
上述图中,代码的含义是test可执行文件依靠的是test.c文件,而下面那行代码就是".c"文件生成".o"的可执行文件。

  1. 执行make

在这里插入图片描述

上面几步就是一个简单Makefile文件代码的编写,在实际使用该工具时,不会那么简单,既然有生成该可执行文件,那有没有删除的呢?

在这里插入图片描述

在这里插入图片描述

上述图中我间接使用了".PHONY"来执行clean,".PHONY"是一个伪目标,是Makefile文件中的一个关键字,意思为某个对象生成伪目标,这样就能在不对的源文件进行修改,重复执行任务了。

Makefile文件对make指令来说,第一个执行目标往往是优先权,仅仅只会执行主目标,也就是从上往下数的第一个执行目标,剩下的目标要执行就需要使用伪目标。

还有另外一种实际使用情况,现在这里是仅生成一个可执行文件,当我们需要同时能生成多个可执行文件时,就需要使用Makefile文件的另一个关键字"all","all"的意思大家都知道是全部的含义,所以在这里就是让make能够同时执行全部的目标文件,并且目标文件为test和today,如下图:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

关于本章知识点如果有不足或者遗漏,欢迎大家指正,谢谢!!!

请添加图片描述

请添加图片描述

相关文章:

Linux开发环境配置(下)

✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ 🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿&#x1…...

系统开发常用命令合集

本文还会持续更新,大家可以点赞收藏~ 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&#xff0c;请你将该数组升序排列。 你必须在 不使用任何内置函数 的情况下解决问题&#xff0c;时间复杂度为 O(nlog(n))&#xff0c;并且空间复杂度尽可能小。 解法 class Solution { public:vector<int> sortArray(vect…...

IPC 进程间通信 消息队列

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

opencv 图像翻转- python 实现

在做图像数据增强时会经常用到图像翻转操作 flip。 具体代码实现如下&#xff1a; #-*-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的任务&#xff0c;当导入时发现只能逐个导入&#xff0c;因此通过接口实现会更方便。 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四、…...

分体式智能网关在现代电力物联网中的优势有哪些?

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

第14篇:下一代网络与新兴技术

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

物联网数据采集网关详细介绍-天拓四方

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

2024软考网络工程师笔记 - 第10章.组网技术

文章目录 交换机基础1️⃣交换机分类2️⃣其他分类方式3️⃣级联和堆叠4️⃣堆叠优劣势5️⃣交换机性能参数 &#x1f551;路由器基础1️⃣路由器接口2️⃣交换机路由器管理方式2️⃣交换机路由器管理方式 交换机基础 1️⃣交换机分类 1.根据交换方式分 存储转发式交换(Store…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

Map相关知识

数据结构 二叉树 二叉树&#xff0c;顾名思义&#xff0c;每个节点最多有两个“叉”&#xff0c;也就是两个子节点&#xff0c;分别是左子 节点和右子节点。不过&#xff0c;二叉树并不要求每个节点都有两个子节点&#xff0c;有的节点只 有左子节点&#xff0c;有的节点只有…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker &#xff1b;并安装。 基础操作不再赘述。 打开 macOS 终端&#xff0c;开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...