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

news2025/6/6 20:05:16

目录

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++程序也是一样的,默认动态链接

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2402061.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

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

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

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

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

【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。 本节阐述成员的可访问性。类的可访问性描述了类的可见性;成员的可访问性描述了类成员的可 见性。 声明在类中的每个成员对系统的不同…

Linux-文件管理及归档压缩

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

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

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

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

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

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

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

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…

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

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

攻防世界-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说明打包说明开源地址 功能特点 可爱的史莱姆在任务栏上自动移动支持…

Dify源码教程:账户和密码传递分析

概述 Dify系统中账户创建过程中的密码处理是Web应用安全的重要环节。本教程详细分析了从前端表单到后端存储的完整流程&#xff0c;展示了Dify如何安全地处理用户凭据。 前端部分 在 dify/web/app/install/installForm.tsx 文件中&#xff0c;当用户填写完表单并点击安装按钮…

数据分析图表类型及其应用场景

说明&#xff1a;顶部HTML文件下载后可以直接查看&#xff0c;带有示图。 摘要 数据可视化作为现代数据分析的核心环节&#xff0c;旨在将复杂、抽象的数据转化为直观、易懂的图形形式。这种转化显著提升了业务决策能力&#xff0c;优化了销售与营销活动&#xff0c;开辟了新…

Github 2025-06-03Python开源项目日报 Top10

根据Github Trendings的统计&#xff0c;今日(2025-06-03统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Python项目10Rust项目1HTML项目1C项目1 系统设计指南 创建周期&#xff1a;2507 天开发语言&#xff1a;Pyt…

电脑提示dll文件缺失怎么办 dll修复方法

当你在使用某些应用程序或启动电脑时&#xff0c;看到提示“DLL文件缺失”的错误信息&#xff0c;这通常意味着某个必要的动态链接库&#xff08;DLL&#xff09;文件无法被找到或加载&#xff0c;导致软件无法正常运行。本文将详细介绍如何排查和修复DLL文件缺失的问题&#x…

【自动思考记忆系统】demo (Java版)

背景&#xff1a;看了《人工智能》中的一段文章&#xff0c;于是有了想法。想从另一种观点&#xff08;⭕️&#xff09;出发&#xff0c;尝试编码&#xff0c;告别传统程序员一段代码解决一个问题的方式。下图是文章原文和我的思考涂鸦✍️&#xff0c;于是想写一个自动思考记…