Linux 的 Vim,gcc,makefile 的使用

news2024/12/22 19:21:37

坚持看完,结尾有思维导图总结

这里写目录标题

  • vim
    • vim的安装
    • vim的配置
    • vim 的使用
      • vim 的三种模式
      • 三种模式对应的命令
        • 通用
        • 命令模式
        • 底行模式
  • gcc 和 g++
    • 编译和执行
    • 预编译
    • 编译
    • 汇编
    • 链接过程
  • make
  • 总结

vim

Vim 是Linux 中使用的编辑器,一般的程序要经历一个过程才能运行,编辑,编译,链接,运行
vim 就是用来编辑的工具,编辑大白话就是用户用来写程序的

vim的安装

在 vim 中 可以用这个命令来安装 vim
yum -y install vim*

vim的配置

直接运行 vim .vimrc
在其中加入对应的命令即可

比如我的 vim 一开始是这样的
在这里插入图片描述
就是一个很普通的编辑器
在这里插入图片描述
然后写入
在这里插入图片描述

再打开对应 c 文件就出现了行号
在这里插入图片描述
所以在 .vimrc 中添加特定的语句,能够对 vim 的显示进行设置
可以设置字体大小,高亮颜色等等

vim 的使用

vim 的三种模式

Vim 常用的有五种模式,其中主要的有三种模式
命0令模式,底行模式,插入模式

命令模式,就是能够通过特定的命令,来实现如同修改,删除,复制粘贴之类的功能
底行模式,打开底行,来实现退出以及相关功能
插入模式,用来编写写程序

三种模式对应的命令

通用

第一个命令,esc(即退出)能够从其他模式切换到命令模式

命令模式

shift : 进入底行模式(冒号是要打上去的)
(n)yy 复制 n 行
(n)p 粘贴,或者相同的内容粘贴 n 遍
(n)dd 剪切,如果没有加p 就是删除
u 撤销命令
cltr r 对撤销命令进行撤销
shift g 光标定义到最后
n shift g 定位到某一行
gg 光标定位到第一行
shift 4 定位到该行结尾
shift 6 定位到该行结尾
w 以单词为单位右移
b 以单词为单位左移
shift ~ 将对应的大写单词连续切换成小写,或者将小写切换成大写
r m 将光标所在的字符替换成 m (m 只是代指摸个字符)
shift r 进入替换模式(替换模式下,直接输入是替换光标下的字符,删除是返回被替换之前的字符)
(n)x 从左向右删除
(n) shift x 从右向左删除
h j k l 光标左下上右移动

底行模式

从命令模式 shift : 直接进入底行模式
! Linux命令 在vim 中直接运行 LInux 的命令
%s/字符a /字符 b /g 将所有字符 a 换成字符 b
vs 分屏(编写程序时常用)
cltr w w 在分屏中将光标切换到不同的界面
q 退出

gcc 和 g++

在编辑器 vim 中 编写好程序后,就需要利用编译器来编译程序
稍微复习一下,编译的过程主要是 预编译 编译 汇编 链接的过程组成,
预编译是生成C 语言文件,将头文件,宏定义等进行替换
编译则是生成了汇编文件,得到汇编语言文件
汇编后则是将汇编语言的文件变为可重定位的二进制文件
最后通过链接生成可执行文件
sudo yum install lrzsz
可以安装 gcc 和 g++

编译和执行

比如我写了顺序表的程序,有 seq .c seq.h 和 process.c
其中 seq.c 和 seq.h 是关于顺序表的头文件和对应函数
process 是 main 函数
在这里插入图片描述
通过编译运行能够看到结果
gcc -o process process.c seq.c
编译必须要把源文件都加上

结果就是开辟了数组又释放了数组
执行可执行文件 ./process
在这里插入图片描述
我们可以用 Linux 看一下编译的过程

预编译

利用命令
gcc -E process.c -o process.i
能够得到对应的预编译后代码
在这里插入图片描述
前面还有很多内容,可以看到 预编译把头文件和 .h 中的内容替换到源文件中了

编译

通过命令
gcc -S process.i -o process.s
记住 是要 .i 文件得到.s 文件
在这里插入图片描述
然后能够看到得到的是包含一堆标识符 (汇编语言) 的文件

汇编

汇编得到的是可重定位的二进制文件
通过命令
gcc -c process.c -o process.o
能够得到二进制文件
在这里插入图片描述
里面就是乱码了,因为是二进制文件
通过反汇编命令
objdump -S process.o
能够重新的到对应的汇编代码
在这里插入图片描述

链接过程

链接分为动态库的链接和静态库的链接
有一些函数是我们源文件就实现的函数,这个就直接使用就可以
但是像一些 printf 的函数,我们的头文件只有 stdio.h 的头文件,我们如何执行这个 printf 呢?

这个时候就需要链接来帮忙了
程序发现自己没有这个函数,但是有头文件,就会找编译器帮忙,编译器发现,这个是库函数,自己安装有(编译器安装的时候许多内容就是安装库),就去自己的默认文件夹寻找了(/usr/lib 这个是 Linux 下的文件夹)
同时编译器有两种方式帮助程序实现这个函数功能
一种是,把对应的库函数的地址交给程序,程序要运行的时候通过地址找到对应库的对应函数来实现功能
这种叫做动态库
还有一种,则是将整个要使用的库交给程序,程序运行时自己有库,就直接运行,这种叫做静态库

在这里插入图片描述

通过 ldd 这个命令,这个命令能列出动态库依赖关系
中间标红的就是 process 这个可执行文件依赖了 libc 这个 c标准库,同时 .so 表示是动态库

利用 file 命令
在这里插入图片描述
也能够看到是动态链接

make

由于我们经常可能输错命令,构建自动化编译的过程是很有必要的
自动化构建就是 用一个文档,将常用的命令集合起来,不用关心文件的依赖关系,利用简单的命令就能够完成文件的编译和删除

这个集合常放在 Makefile 中,这个 命令就是 make

现在文件只有这些
在这里插入图片描述
创建 Makefile 并且进入
在这里插入图片描述

process:process.c seq.c
说明的是依赖关系, process 是可执行文件,来源于 process.c 和 seq.c
gcc -o 的命令是依赖方式,说明利用这个命令得到 process

.PHONY 是一个伪目标,说明这个命令(现在是 clean)总是执行
如果没有 .PHONY
比如在 process 前就没有 那么生成的 process 文件有修改时间,process.c 和 seq.c 都有修改时间
当 process 的时间比 process.c 的时间新,就不会执行这个命令
如果 process.c 的修改时间更新 就会执行
有了 .PHONY 就忽略时间总是执行

clean :
说明这个指令没有依赖文件,直接执行
结果
在这里插入图片描述
原来没有process (绿色)文件,现在 make process 后有了
make clean 后,这个文件又会消失,被清除了
可以看到我就不用那么长的代码,直接就自动编译了,爽死

总结

在这里插入图片描述

希望大家看完,能够有所收获
如果有错误,请指出我一定虚心改正
动动小手点赞
鼓励我输出更加优质的内容

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

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

相关文章

Codeforces Round #841 (Div. 2) and Divide by Zero 2022(A~E)

A. Joey Takes Money给出一个序列a,每次操作可以选择两个数,将两个数分别改成与原数乘积相同的两个数,问最后得到的最大的数组和是多少。思路:乘积一定,和最大一定是与1相乘。则整个数组的积与n - 1个1的和就是最大值。…

探索云原生技术之容器编排引擎-Kubernetes/K8S详解(7)

❤️作者简介:2022新星计划第三季云原生与云计算赛道Top5🏅、华为云享专家🏅、云原生领域潜力新星🏅 💛博客首页:C站个人主页🌞 💗作者目的:如有错误请指正,将…

缓存(redis)与数据库(MYSQL)数据一致性问题

在MYSQL数据库集文章中,仔细的学习了一些MYSQL数据库的知识。但是,随着我们的业务越来越好,那么我们不可能直接去操作MYSQL数据库。因为直接去操作MYSQL终究会有比较多的I/O操作,而使整个系统的性能最终受到数据库I/O的制约而无法…

教外篇(6):C++ qrencode 实现二维码生成

系列文章目录 文章目录 系列文章目录前言一、qrencode库的基本使用二、BMP图片生成原理三、二维码生成四、放大图像、解决编码问题前言 该系列教程目录与说明可以查看这篇文章::C/C++教程 本文主要介绍如何使用C++来实现二维码的生成,使用到了开源库:qrencode 代码生成结…

C++入门--vector

目录 vector的介绍 vector的使用 对象的定义 遍历 reserve与resize insert与erase 迭代器失效 vector的模拟实现 vector的介绍&#xff1a; vector是表示可变大小数组的序列容器。 vector的使用&#xff1a; 对象的定义&#xff1a; void test_vector1() {vector<int…

ZYNQ图像-腐蚀膨胀笔记

大磊fpga 腐蚀 下图从左到右依次为a&#xff0c;b&#xff0c;c step1&#xff1a;将b中的黄色十字架在a中遍历 step2&#xff1a;当b的黄色方格在a中 没有碰到白色方格 时输出中心坐标 step3&#xff1a;将step2中所有输出的坐标涂成黄色&#xff0c;得出c图 膨胀 step1…

Redhat 7 安装 iftop软件

1.关闭subscription-manager vi /etc/yum/pluginconf.d/subscription-manager.conf enable 0 2.通过浏览器下载Centis-7.repo http://mirrors.aliyun.com/repo/Centos-7.repo 3.上传至/etc/yum.repos.d/ 4.修改Centos-7.repo文件 #cd /etc/yum.repos.d/ #ls #vim CentOS…

怎么看电脑是32位还是64位?超级简单的方法!

熟悉计算机的朋友都知道&#xff0c;电脑系统可以分为32位和64位系统。它们之间有什么区别&#xff1f;它们支持不同的内存&#xff1a;32位操作系统最多支持4G内存&#xff0c;但64位系统可以支持4G、8G、16G、32G、64G、128G、256G等。兼容软件也不同&#xff1a;32位只支持3…

老照片修复方法是什么?这篇文章来告诉你

我们每年回老家时&#xff0c;都喜欢看看以前的老物件&#xff0c;尤其是照片&#xff0c;因为它承载了我们一代又一代人的回忆&#xff0c;不管过去了多久&#xff0c;家里的长辈拿到一张照片时&#xff0c;都可以准确的说出当时在哪里&#xff1f;在做什么&#xff1f;由此引…

基于python和cv2、pytorch实现的车牌定位、字符分割、字符识别项目

问题描述车牌的检测和识别的应用非常广泛&#xff0c;比如交通违章车牌追踪&#xff0c;小区或地下车库门禁。在对车牌识别和检测的过程中&#xff0c;因为车牌往往是规整的矩形&#xff0c;长宽比相对固定&#xff0c;色调纹理相对固定&#xff0c;常用的方法有&#xff1a;基…

linux C -- 内存管理

链接: linux C学习目录 linux C 共享内存机制共享内存物理位置shared memory常用函数编程模型范例write.cread.c修改参数实验共享内存 二个或者多个进程,共享同一块由系统内核负责维护的内部内存区域其地址空间通常被映射到堆和栈之间无需复制信息,最快的一种IPC机制需要考虑同…

web应用 —— HTML

web应用 一、HTML 1.插件 1.Live Server 模拟网站服务器 2.Auto Rename Tag 自动修改标签对 3.设置settings-format-勾选Format On Save &#xff08;创建文件&#xff1a;File-Open Folder-新建文件夹-命名文件&#xff09; 2.html文档结构 html所有标签为树形结构&…

基于YOLOv5+C3CBAM+CBAM注意力的海底生物[海参、海胆、扇贝、海星]检测识别分析系统

在我前面的一些文章中也有用到过很多次注意力的集成来提升原生检测模型的性能&#xff0c;这里同样是加入了注意力机制&#xff0c;区别在于&#xff0c;这里同时在两处加入了注意力机制&#xff0c;第一处是讲CBAM集成进入原生的C3模块中&#xff0c;在特征提取部分就可以发挥…

Microsoft系统漏洞修复

近期收到服务器系统漏洞扫描&#xff0c;发现很多关于Microsoft本身的系统漏洞。 有很多新手不知道怎么去修复系统漏洞&#xff0c;害怕一旦修复出问题&#xff0c;自己要担责。 我这里讲解下怎么准备的去寻找漏洞&#xff0c;并把它修复的过程。 我已下列的漏洞为例&#x…

RK3588平台开发系列讲解(日志篇)syslog介绍

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、syslog介绍二、syslog的架构三、syslog日志组成四、syslog接口说明1、openlog2、syslog3、closelog五、syslog.conf接口说明1、selector2、level3、action4、示例沉淀、分享、成长,让自己和他人都能有所收获!&am…

计算机网络第三章

目录 1.数据链路层 1.数据链路层的基本概述 2.数据链路层的功能概述 3.封装成帧 4.差错控制 1.检错编码 2.纠错编码 5.流量控制 1.停止-等待协议 2.选择重传协议(SR) 3.后退N帧协议(GBN) 6.介质访问控制 1.静态划分信道(信道划分介质访问控制) 2.动态分配信道 7.局域网 8.链路…

【经验分享】美赛报名以及注册方法-以2023年美赛为例

首先点击COMAP的官网链接&#xff1a; https://www.comap.com/ 然后选择Contests目录下的MCM/ICM 选择 Learn More and Register 然后选择 Click here to register for the 2023 MCM/ICM contest 注册分为两个步骤&#xff1a;顾问&#xff08;指导教师&#xff09;注册和填…

uni-app中自定义TabBar

1.由于原生的tabBar不能做到事件的拦截处理所以才自定义 注意点&#xff1a;自定义tabBar后则原生的uni.switchTab(OBJECT)不能再使用了 第一步&#xff1a;需要把原生的tabBar注释掉 第二步&#xff1a;在components下新建TabBar.vue文件&#xff08;那个页面用那个页面引入…

RHCE-Web服务器在linux上的部署,了解hash算法以及常见的加密方式

目录 1.WEB服务器&#xff08;Web Server&#xff09; 浏览器 工作原理 常见状态码&#xff1a; www服务器的基本配置 2.web服务配置样例 3.了解hash算法以及常见的加密方式 hash算法&#xff1a; 常用HASH函数 处理冲突方法 常用hash算法的介绍&#xff1a; ssh协议…

Composition步骤

纲要&#xff1a; SWC属于AUTOSAR的Component文件夹下&#xff0c;而Composition属于Composition文件夹下。 AUTOSAR Project Structure Sample目录 1. Create Software Composition 2. Add SWC into Composition 3. Create AssemblyConnector between SWCs 1. Create Sof…