当前位置: 首页 > 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…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络&#xff0c;将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具&#xff0c;支持 Chrome、Firefox、Safari 等主流浏览器&#xff0c;提供多语言 API&#xff08;Python、JavaScript、Java、.NET&#xff09;。它的特点包括&a…...

k8s业务程序联调工具-KtConnect

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

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能&#xff1a;服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...

push [特殊字符] present

push &#x1f19a; present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中&#xff0c;push 和 present 是两种不同的视图控制器切换方式&#xff0c;它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

深入理解Optional:处理空指针异常

1. 使用Optional处理可能为空的集合 在Java开发中&#xff0c;集合判空是一个常见但容易出错的场景。传统方式虽然可行&#xff0c;但存在一些潜在问题&#xff1a; // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...

「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案

在移动互联网营销竞争白热化的当下&#xff0c;推客小程序系统凭借其裂变传播、精准营销等特性&#xff0c;成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径&#xff0c;助力开发者打造具有市场竞争力的营销工具。​ 一、系统核心功能架构&…...