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

Linux开发工具(apt,vim,gcc)

目录

yum/apt包管理器

Linux编辑器 vim 

1.见一见vim

 2.vim的多模式

3.命令模式底行模式等

4.vim的配置

Linux编译器  gcc/g++

1.预处理(宏替换)

2.编译(生成汇编)

3.汇编(生成机器可识别代码)

4.连接(生成可执行文件或库文件)

几个问题

如何理解条件编译?

为什么C/C++编译,要先变成汇编?

什么叫做动静态库,什么叫做动静态连接,如何理解?


yum/apt包管理器

在Linux系统中安装软件 有三种方法

1.通过源码安装

2.通过软件包安装 --- rpm

3.包管理器 apt/apt -get(Ubuntu) yum(Centos)

源码安装安装过程复杂,技术门槛高,安装时间长,资源消耗大,版本管理和升级困难,因此我们不推荐源码安装

软件包安装,平常安装软件的时候,并非只是安装一个软件,而是要把其所有的依赖也要安装到本地,所以我们安装一个软件,显示是10mb的软件,安装到系统可能是安装了100mb的东西

 

我们平常使用软件包安装时,很容易发生依赖缺失和版本兼容性问题,而一个软件如果依赖缺失,就无法正常运行,或者依赖的版本与软件不一致,也会导致软件发生运行错误,因此我们也不推荐软件包安装。

那么就剩最后包管理器安装了。

安装一个软件,不管怎么样,第一个解决的问题就是先从网络中下载,然后进行安装,安装并不复杂,就是拷贝,所以我们的根目录才会有这么多子目录,bin是装可执行程序的

etc是用来放配置文件的

var是程序运行后写日志的

tmp是程序运行时存放临时文件的

所以Linux系统会分门别类的建立出各种目录,是为了方便 我们在网络下载下来的软件,把其日志,临时文件,动静态库分别拷贝到不同的目录下去进行管理

 我们可以看到像我上述所说的目录,拥有者所属组都是root,other是无法访问的,这就注定了安装软件时,必须使用root权限,安装到系统

而安装到usr/bin目录下,尽管拥有者和所属组都是root,但是他给了other可执行权限x,这就是为什么usr/bin目录下,随便一个指令任何一个人都能使用的原因,所以在Linux系统中,只要安装一次,任何人都能使用。

因为他没有安装到home目录下,而是系统根目录,谁都能使用

为什么我们推荐包管理器安装,因为他会自动给我们解决包的依赖问题

什么是包管理器

类似于我们手机上面的应用商店

那么问题就来了,你说包管理器类似于我们手机的应用商店,那么我们在手机上下载的抖音,是字节跳动公司提供的,人用的多,他们才能盈利,所以他们提供。

Linux上的软件,是谁提供的? 那么此时又回到了另一个问题上

如何去评估一个操作系统的好坏?

通过内核版本,社区,文档,适用人群,提供的问题等等,即操作系统的生态问题

那么一款操作系统背后的配套软件算不算生态的一环? 肯定算的,如果一款操作系统没有对应的配套软件,那么他就没有什么竞争力,就会被其他的操作系统所淘汰。

因此为了让操作系统有竞争力,就会提供相应的Linux软件

 开源:本质是一种商业模式

我的机器怎么知道下载软件的链接呢?

操作系统内置链接

而这个由于操作系统是国外引进国内的,它们的链接都是国外的,而我们如果直接通过链接下载,会非常卡,非常慢,除非我们使用特殊手段。所以我们就在国内将国外的软件镜像到国内,其实就是拷贝一份 ,在把内置链接修改,这样我们下载软件,直接到国内网站下载,就解决了下载卡慢的问题。

演示一下apt install

 我们通过apt list 命令 可以查看我们能安装的软件

卸载软件 使用 apt remove 命令

 上面的是Ubuntu系统下的命令,Centos系统可以用下面的命令

在Ce

ntos系统下

在 配置文件 /etc/yum.repos.d/中存在Centos-Base.repo文件,可以通过下面的命令查看 

 

 而这个文件里就是yum源,存在对应的软件下载链接 


Linux编辑器 vim 

我们之前学习C/C++的时候,别人问你写代码用什么,VS2022,调试用什么? VS2022,所以我们之前用的VS2022是集编译编写开发调试发布为一体的集成开发环境,简称IDE,而在Linux下开发,所有的工具都是独立的,写代码用vim,编译用gcc/g++,调代码用gdb,构建用Makefile。

其实IDE底层就是一个个零散的工具,所以在装VS2022的时候,可能安装了好多可执行程序

今天我们学习的vim,是Linux的编辑器

输入vim --version 命令查看你的vim版本

输入vim 可以进入vim

进入后想退出可以,按住shift+ z键 快速按两下自动退出

或者 shift + : 进入底行模式 输入q 回车退出

1.见一见vim

在目录下创建一个code.c

再用vim code.c打开就能对code.c进行编写代码

但是此时你的vim还没有配置,顶多有几个语法提示,像一个记事本一样

 2.vim的多模式

3.命令模式底行模式等

命令模式:

命令模式转插入模式 有三个键 aio

i:从光标位置进入

a:从光标下一个位置进入

o:另起一行进入

底行模式:

w:保存 q:退出  !:强制执行命令

set nu:显示行号   no nu:取消显示行号

底行输入vs + 文件名命令

可以分屏两个终端

我们对应操作,以及底行输命令,都会在光标所在的终端执行

我们可以进行切换光标从左切到右

按两下 ctrl + w 就能实现光标切换

我们使用vs命令,不只局限于两个,可以形成多个分屏终端,三个四个都可以

我们还可以用 /+搜索的内容  ,vim会直接给你把搜索的目标高亮出来,然后按n,可以帮你找到下一个搜索的内容,和shift+#功能重叠

使用vim的小技巧

当你用vim打开文件时,光标会出现在上次退出时光标所在的位置

我们可以用 vim src +n 让文件打开时,让光标定位到指定行 

在命令行中输入 !后跟字母,系统会查找本地历史上最近的以此字母开头的命令,并执行

!v就会执行vim命令

4.vim的配置

在你自己的家目录下,会存在有些隐藏文件,会存在一个.vimrc的文件,如果没有可以自己创建一个,然后vim打开,可以在里面输入对应的配置信息,这样vim在打开时,会自动在你的家目录中,搜索访问vimrc文件,如果没有,vim就使用默认行为,如果有配置文件,vim就会读取其中的配置项,并进行配置

以下就是一些vimrc中的配置信息,他可以设置行号,tab步数,高亮,相对行号,自动折行等等 

如果你想配置,可以去网上搜索,直接拷贝一份,粘贴到你对应的vimrc文件中,但是如果想要一些更加高级的功能,自动补齐,分屏操作,就需要打一些插件了


Linux编译器  gcc/g++

gcc和g++对应的选项是完全一样的,只不过gcc只能用来编译c语言,而g++既能编译c也能编译c++

我们用vim写一个code.c文件

在Linux中编译一个程序,通过命令

 gcc code.c -o  mycode

-o表示目标

1.预处理(宏替换)

预处理阶段会完成 头文件展开,去除注释,宏替换

gcc -E code.c -o code.i

 -E选项表示开始进行程序翻译,在预处理完成后,就停下来

即在完成对文件的头文件展开,去除注释和宏替换后,就形成了code.i的临时文件

那么此时的code.i文件还是c语言吗?

code.i还是c语言

2.编译(生成汇编)

编译将c语言变成汇编语言

gcc -S code.i -o code.s

-S表示开始翻译,编译完了就停下来 

3.汇编(生成机器可识别代码)

gcc -c code.s -o code.o

-c 表示开始翻译,汇编完成,就停下来 

如果我们不带-o选项,默认生成同名.o

code.o叫做可重定位目标文件 ,在win,VS2022中这类文件后缀是.obj

此时.o文件已经变成了一堆乱码,因为它已经变成了二进制文件了

而此时这个文件也没有办法直接执行

即便加上了可执行权限x也无法执行

我们的源文件中会包含很多的库方法 

4.连接(生成可执行文件或库文件)

gcc code.o -o code

在Linux中ldd命令可以查看可执行程序依赖哪些库

由于我们的代码中使用了printf函数,这个函数并不是我实现的,我只是调用了printf,那么他的实现在哪里

他的实现在系统的C标准库中

所以我们的c程序需要依赖c标准库

而c标准库就是libc.so

 而库分两类:

1.动态库: Linux(.so),win(.dll)

2.静态库:Linux (.a),win(.lib)

系统中的可执行程序也要依赖库,我们写的可执行程序也要依赖库

几个问题

如何理解条件编译?

命令行级别的宏定义

gcc在命令中可以进行动态添加宏 ,-D后面加所要定义的宏,如上就是定义了M

预处理的本质就是在修改编辑我们的代码

条件编译的用途?
1.软件进行专业度,收费情况进行区分(业务),使用条件编译,可以进行代码动态裁剪

2.内核源代码也是采用条件编译进行代码裁剪

3.通过条件编译来适配开发工具,应用软件


为什么C/C++编译,要先变成汇编?
 

这个就要追溯到历史原因了,早期计算机没有编程,是通过开关来给计算机输入0/1的,但是过于麻烦,等到七八十年代,用纸带打孔编程,通过光敏信号源,纸带透光不透光来代表0/1,进行编程,但还是二进制编程说到底还是过于麻烦,于是人们发明了汇编语言

 有了汇编语言就要有编译器了,来把汇编语言映射成二进制

后来人们觉得汇编语言也太麻烦了

于是汇编语言出现了特别多的分支,70年代丹尼斯里奇发明了C语言

后面就是C++,JAVA,GO等等

此时想一下,有了c语言之后,也是要把c语言变成二进制的,

此时是直接把c语言变成二进制,还是把c语言翻译成汇编语言,再翻译成二进制呢?

我们肯定会选择后者

1.C语言到汇编还是文本语言到文本语言,翻译难度较低

2.在C语言产生时,汇编语言已经发展了好几年了,我们直接把C语言翻译成汇编语言,就省去了将C语言变成二进制语言的过程,算是站在了巨人的肩膀上。

况且如果忽略成本,把C语言直接翻译成二进制,等到C++出现,JAVA出现,还是要继续研发将语言直接变成二进制语言,成本过大了。

因此为什么C/C++编译,要先变成汇编?是因为历史的过程


什么叫做动静态库,什么叫做动静态连接,如何理解?

库是一套方法或者数据集,为我们开发提供最基本的保证(基本接口,功能,加速我们二次开发)

libc.so libc.a

在Linux中,库的命名有固定规则

动静态库的对比

  1. 动态库形成的可执行程序体积一定很小
  2. 可执行程序对静态库的依赖度小,动态库不能缺失
  3. 程序运行,需要加载到内存,静态链接的,会在内存中出现大量的重复代码
  4. 动态链接,比较节省内存和磁盘资源 

我们在使用gcc编译可执行程序,默认就是动态链接

我们用file命令,查看code,也能看到其为动态链接        

 进行动态链接的前提是这个库必须存在

很显然它是存在的

如果想进行静态链接,是需要我们手动添加选项的 ,且C静态库也要存在

我们用ldd命令去查,可执行程序所依赖的库,是没有办法查到的,因为他是静态链接,没有依赖的库 

我们可以看一下动态链接的程序和静态链接的程序的大小差异

可以发现静态比动态程序的大小多了特别多

g++编译C++程序也是一样的,默认动态链接

 

相关文章:

Linux开发工具(apt,vim,gcc)

目录 yum/apt包管理器 Linux编辑器 vim 1.见一见vim 2.vim的多模式 3.命令模式底行模式等 4.vim的配置 Linux编译器 gcc/g 1.预处理(宏替换) 2.编译(生成汇编) 3.汇编(生成机器可识别代码) 4.连…...

C# ExcelWorksheet 贴图

C# ExcelWorksheet 贴图 在C#中,如果你想在Excel工作表中插入图片(例如,在ExcelWorksheet中贴图),你可以使用ClosedXML或EPPlus这样的库来操作Excel文件。下面我将分别介绍如何使用这两个库来实现这一功能。 使用ClosedXML 首先,确保你已经安装了ClosedXML包。你可以通…...

鸿蒙Next开发真机调试签名申请流程

背景: 在学习鸿蒙next开发应用的初期总是会遇到一堆的问题,毕竟鸿蒙next开发不管是他的ArKTS语言还是他的开发工具DevEco Studio都还在起步阶段,就像当初的Android起步一样,总会有资料不足的一些问题。就比如我们学习下载完DevEco…...

[yolov11改进系列]基于yolov11引入上下文锚点注意力CAA的python源码+训练源码

【CAA介绍】 本文记录的是基于CAA注意力模块的RT-DETR目标检测改进方法研究。在远程遥感图像或其他大尺度变化的图像中目标检测任务中,为准确提取其长距离上下文信息,需要解决大目标尺度变化和多样上下文信息时的不足的问题。CAA能够有效捕捉长距离依赖…...

【Elasticsearch】 查询优化方式

在优化Elasticsearch的查询性能时,可以从多个维度着手,包括索引设计、查询优化、集群配置、数据管理以及监控分析等。常见的优化方式和策略有以下几种: 一、索引优化 合理设计字段类型: 字段类型选择: 对于不需要分词的…...

Xcode 16.4 + iOS 18 系统运行时崩溃:___cxa_current_primary_exception 符号丢失的原因与解决方案

在使用 Xcode 16.4 构建项目,运行到 iOS 18.3 或更早版本系统(包括模拟器)时,出现了如下的运行时崩溃: dyld[22183]: Symbol not found: ___cxa_current_primary_exceptionReferenced from: /.../WidgetOn.app/Widget…...

【linux】全志Tina预编译一个so库文件到根文件系统/usr/lib/下

一、sdk中新建文件夹 路径: V:\t113\work3\t113\openwrt\package\feeds\libs\md5util md5util为需要注入的库文件夹。 文件结构 libs md5util files libmd5util.so makefile etc.. 二、编写makefile include $(TOPDIR)/rules.mkPKG_NAME : md5util PKG_VERSIO…...

C# 类和继承(成员访回修饰符)

成员访回修饰符 本章之前的两节阐述了类的可访问性。对类的可访问性,只有两种修饰符:internal和public。 本节阐述成员的可访问性。类的可访问性描述了类的可见性;成员的可访问性描述了类成员的可 见性。 声明在类中的每个成员对系统的不同…...

c++ stl容器之map用法

目录 (1)map介绍 (2)map、multimap、unordered_map区别 (3)map用法 1.map接口表 2.使用举例 插入数据与遍历数据 查找关键字和值 删除元素 按照值排序 (4)multimap用法 &…...

Linux-文件管理及归档压缩

1.根下的目录作用说明: /:Linux系统中所有的文件都在根下/bin:(二进制命令目录)存放常用的用户命令/boot:系统启动时的引导文件(内核的引导配置文件,grub配置文件,内核配置文件) 例…...

结合Jenkins、Docker和Kubernetes等主流工具,部署Spring Boot自动化实战指南

基于最佳实践的Spring Boot自动化部署实战指南,结合Jenkins、Docker和Kubernetes等主流工具,提供从环境搭建到生产部署的完整流程: 一、环境准备与工具选型​​ ​​1.基础设施​​ ​​Jenkins服务器​​:安装Jenkins LTS版本,配置JDK(推荐JDK 11+)及Maven/Gradle插…...

微软认证考试科目众多?该如何选择?

在云计算、人工智能、数据分析等技术快速发展的今天,微软认证(Microsoft Certification)已成为IT从业者、开发者、数据分析师提升竞争力的重要凭证。但面对众多考试科目,很多人不知道如何选择。本文将详细介绍微软认证的考试方向、…...

MCP协议在LLM系统中的架构与实现原理研究

MCP协议的角色和功能定位 模型上下文协议(Model Context Protocol, MCP) 是由Anthropic公司(Claude模型的发布方)提出的一种开放协议,旨在标准化大型语言模型(LLM)与外部数据源、工具和服务之间的交互方式。可以将MCP类比为AI应用的“USB-C接口”:通过统一的接口协议,…...

Dify工作流实践—根据word需求文档编写测试用例到Excel中

前言 这篇文章依赖到的操作可查阅我之前的文章: dify里的大模型是怎么添加进来的:在Windows本地部署Dify详细操作 flask 框架app.route()函数的开发和调用:PythonWeb开发框架—Flask工程创建和app.route使用详解 结构化提示词的编写&…...

【LC实战派】小智固件编译

这篇写给立创吴总,是节前答应他配合git代码的说明;也给所有对小智感兴趣的小伙伴。 请多提意见,让这份文档更有价值 - 第一当然是拉取源码 - git clone https://github.com/78/xiaozhi-esp32.git 完成后,先查看固件中实际的…...

HTTP(超文本传输协议)详解

目录 一、基本概念 二、HTTP报文(结构) (一) 请求报文 (二) 响应报文 三、HTTP请求方法 1. GET方法 2. POST方法 3. PUT方法 4. HEAD方法 5. DELETE 6. OPTIONS 一、知识扩展 7. TRACE 8. CONNECT 四、HTTP持久通信 (一) HTTP keep-alive…...

Unity安卓平台开发,启动app并传参

using UnityEngine; using System;public class IntentReceiver : MonoBehaviour {public bool isVR1;void Start(){Debug.LogError("app1111111111111111111111111");if (isVR1){LaunchAnotherApp("com.HappyMaster.DaKongJianVR2");}else{// 检查是否有传…...

jdbcTemplate.query备忘录

jdbcTemplate.query中使用全部字符串和参数注入&#xff0c; 查询速度为什么差距这么大 如何正确使用JdbcTemplate参数化查询 1、使用?占位符 String sql "SELECT * FROM users WHERE name LIKE ?"; List<User> users jdbcTemplate.query(sql,new Object[…...

如何搭建Z-Blog PHP版本:详细指南

Z-Blog是一款功能强大且易于使用的博客平台&#xff0c;支持PHP和ASP两种环境。本文将重点介绍如何在PHP环境下搭建Z-Blog博客系统&#xff0c;帮助您快速上线自己的个人博客站点。 准备工作 1. 获取Z-Blog PHP版本 首先&#xff0c;访问Z-Blog官方网站下载最新版本的Z-Blog…...

Docker 常用命令详解

&#x1f433; Linux 安装 Docker 及常用命令详解&#xff08;适用于 Ubuntu&#xff09; &#x1f4e6; 一、安装 Docker&#xff08;Ubuntu 系统&#xff09; 1. 更新系统 sudo apt update sudo apt upgrade -y2. 安装必要依赖 sudo apt install -y apt-transport-https …...

uniapp uni-id-co errCode“:“uni-id-captcha-required“,“errMsg“:“Captcha required

连续登录失败后就会出现图形验证码校验&#xff0c;如果前端不需要图形验证码校验&#xff0c;uni-id-co文件夹下找到module下的login文件夹下的login.js,注释掉Captcha相关校验&#xff0c;关掉即可 const {preLoginWithPassword,postLogin } require(../../lib/utils/login)…...

Github Copilot新特性:Copilot Spaces-成为某个主题的专家

概述 当今的工程团队都会面临知识碎片化的问题。关键的上下文分散在代码、文档和团队成员的头脑中&#xff0c;这使得他们很难在一个新的领域快速上手并完成工作。Copilot Spaces 通过集中您的项目上下文解决了这个问题&#xff0c;因此 Copilot 可以根据您的工作提供更智能、…...

React 第五十三节 Router中 useRouteError 的使用详解和案例分析

前言 useRouteError 是 React Router v6.4 引入的关键错误处理钩子&#xff0c;用于在 路由错误边界&#xff08;Error Boundary&#xff09; 中获取路由操作过程中发生的错误信息。 它提供了优雅的错误处理机制&#xff0c;让开发者能够创建用户友好的错误界面。 一、useRou…...

12分钟讲解主流React库

本内容是对 Every React Library Explained in 12 Minutes 内容的翻译与整理。 React Router React Router 是一个用于控制网站导航的库&#xff0c;同时也允许你自定义网站的 URL。它使用自定义组件&#xff0c;如 BrowserRouter、Routes 和 Route 组件&#xff0c;以创建 UR…...

《doubao-lite-32k 模型缓存机制使用指南》

doubao-lite-32k 模型缓存机制使用指南 一、缓存概述 1. 缓存作用 doubao-lite-32k 模型的缓存(Session 缓存)主要用于多轮对话场景,实现以下功能: 存储历史对话信息(Token),避免重复传输上下文,减少计算资源消耗。 优化长上下文(最长 32K Token)处理效率,提升多…...

攻防世界-XCTF-Web安全最佳刷题路线

每次写序都是最烦恼的&#xff0c;都不知道写什么&#xff0c;CTF是团队竞赛&#xff0c;有很多分支&#xff08;Web安全&#xff0c;密码学&#xff0c;杂项&#xff0c;Pwn&#xff0c;逆向&#xff0c;安卓&#xff09;&#xff0c;可以每个领域都涉猎&#xff0c;或许感觉那…...

t021-高校物品捐赠管理系统【包含源码材料!!!!】

视频演示地址 摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装高校物品捐赠管理系统软件来发挥其高效地信息…...

设计模式——面向对象设计六大原则

摘要 本文详细介绍了设计模式中的六大基本原则&#xff0c;包括单一职责原则、开放封闭原则、里氏替换原则、接口隔离原则、依赖倒置原则和合成复用原则。每个原则都通过定义、理解、示例三个部分进行阐述&#xff0c;旨在帮助开发者提高代码的可维护性和灵活性。通过具体代码…...

Python制作史莱姆桌面宠物!可爱的

史莱姆桌面宠物 一个可爱的桌面史莱姆宠物&#xff0c;它会在您的任务栏上移动并提供可视化设置界面。 这里写目录标题 史莱姆桌面宠物功能特点安装与运行直接运行方式创建可执行文件 使用说明自定义GIF说明打包说明开源地址 功能特点 可爱的史莱姆在任务栏上自动移动支持…...

React hook之userReducer

在 React 中&#xff0c;useReducer 是一个用于管理复杂状态逻辑的 Hook&#xff0c;它类似于 Redux 中的 reducer 模式&#xff0c;但更轻量且适用于组件内部或结合 Context API 实现全局状态管理。以下是 useReducer 的详细用法指南&#xff1a; 1. 基本语法 const [state, …...