Linux系统编程—第二节—(Centos 7)开发工具等(yum vim gcc g++ gdb make Makefile )

简介: 会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作

目录


一、Linux 软件包管理器 yum


什么是软件包?


二、Linux编辑器:vim


2-1 vim的一键配置


2-2 vim的使用


2-2-1 vim的模式


三种命令模式的转换


举例:


vim正常模式命令集


插入模式


Linux编译器:gcc/g++使用


Linux调试器:gdb


Linux项目自动构建化工具:Makefile



笼统地来说,在Linux命令行下,软件安装方式有三种,分别是:


源码安装;


rpm包安装;


yum安装。


其中,我们最推荐的还是用yum去安装。将来我们随着只是的深入学习,我们也可能会进行源码安装。但无疑,yum安装是最简单便捷的。


一、Linux 软件包管理器 yum

什么是软件包?

在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序.


但是这样太麻烦了,


于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安 装程序)


放在一个服务器上, 通过包管理器可以很方便的获取到这个编译好的软件包, 直接进行安装.


软件包和软件包管理器, 就好比 "App" 和 "应用商店" 这样的关系.


那yum究竟是什么东西?


yum(Yellow dog Updater, Modified)是Linux下非常常用的一种包管理器. 主要应用在Fedora, RedHat, Centos等发行版上.


首先,我们需要清楚,在我们的服务器买过来之后,其大多数都会默认给我们装上yum指令的安装包(就是说,我们的yum本质上也是一个可执行程序,而这个程序一般都是在我们买服务器时就给我们默认装配好的)


我们还是用应用商店来举一个例子:


在我们手机上的都会有一个应用市场(app客户端),在这个客户端里,我们能够看到各种各样的app安装。那么这些显示出来的app是在哪里呢?


就是在其所属位置的远端服务器上,其相当于软件包的形式,当我们需要安装时,点击旁边的安装(install),便可以一键安装。


而yum,那个软件包管理器->就相当于那个应用市场(app客户端),我们通过yum,可以安装各种软件包。而软件包,就是具体的应用。


需要注意,yum不仅仅可以安装,还可以查找、搜索、卸载。


注意事项:

安装软件时由于需要向系统目录中写入内容, 一般需要 sudo 或者切到 root 账户下才能完成.

yum安装软件只能一个装完了再装另一个. 正在yum安装一个软件的过程中, 如果再尝试用yum安装另外 一个软件, yum会报错

我们用yum来举例安装一个软件吧。(实际上,这个功能或者说软件可能在购买的服务器上已经是安装过了)


我们尝试安装一下:rzsz。


它是可以支持在windows和Linux操作系统上互传文件的命令。


我们可以先来搜索一下:



如图,我们就搜索出了这么个东西。


说明一下:


软件包名称: 主版本号.次版本号.源程序发行号-软件包的发行号.主机平台.cpu架构.

"x86_64" 后缀表示64位系统的安装包, "i686" 后缀表示32位系统安装包. 选择包时要和系统匹配.

"el7" 表示操作系统发行版的版本. "el7" 表示的是 centos7/redhat7. "el6" 表示 centos6/redhat6.

最后一列, base 表示的是 "软件源" 的名称, 类似于 "小米应用商店", "华为应用商店" 这样的概念.

然后直接


yum install lrzsz.x86_64

(如果加上-y选项,意为免交互版本)



有了这个之后,


那么你如果想从windows->Linux传文件,那么可以用


输入进去之后,就会弹出一个窗口,直接选择就可以了。


当然,也可以直接进行拖拽,实际上这样系统会默认调用rz命令。


如果想要从Linux往windows传文件,可以调用sz命令。


当然,需要跟上文件。比如:

sz test.c   //意为将test.c文件上传


然后就会弹出一个窗口,继而选择想要传递的路径。


那么,如果想要卸载改应用,就直接:


yum remove lrzsz.x86_64

总结一下:

image.png


我们继续:


二、Linux编辑器:vim

2-1 vim的一键配置

首先,我们购买的服务器里应该也是有vim这样的命令的。


但是,我们用vim打开文件之后,它是这个样子的:


简直不要太淳朴!


这个样子的:

image.png



其实网上也有各种vim配置的方法,但是笔者觉得都太复杂。‘


我们这里提供一个链接,是一位老师提供的,用于一键配置vim环境,配置以后,它就会是这样的(如下图)


链接:GitHub - askunix/VimForCpp: VIM一键配置C/C++开发环境,可自动下载各类插件。


curl -sLf./install.sh && bash ./install.sh

image.png



就直接可以复制上去,让它执行,然后不用管了,闭着眼睛就可以了。



2-2 vim的使用

2-2-1 vim的模式

vim实际上是一种多模式的编译器。而我们最常使用的是有三种模式,分别是:命令模式、插入(编辑)模式和底行模式。


我们来介绍介绍:


命令模式:(也叫普通模式、正常模式)


控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode


我们在用vim打开文件的时候,默认就是处在命令模式下。在该模式状态下,我们键盘上所输入的大部分指令(或者说字符),都是无效的。


就是这样:


插入模式:(也叫编辑模式)


只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。该模式是我们后面用的最频繁 的编辑模式。


编辑器进入插入模式,进行正常的文字输入。


这个时候,我们会发现在底部有一个insert的出现



表示vim现在处于插入模式。



底行模式:


文件保存或退出,也可以进行文件替换,找字符串,列出行号等操作。 在命令模式下,shift+: 即可进入该模式。要查看你的所有模式:打开vim,底行模式直接输入


在底行命令行下,可以输入指令:


image.png


三种命令模式的转换

从命令模式->插入模式:


有三种转换方法:


1、按 i 可以进入;2、按 o 可以进入;3、按 a 可以进入。


它们三者的区别:i 表示从当前位置进入编辑模式(即光标位置不变);o表示新启一行进入编辑模式;a表示从同行下一个位置进入编辑模式。


插入模式->命令模式:


按Esc键;


命令模式->底行模式:


按 shift 加  ;  


实际就是相当于输入冒号 (:)


底行模式->命令模式


按Esc键;


只有从命令模式才能转换到底行模式。


退出vim及保存文件:在[正常模式]下,按一下「:」冒号键进入「底行模式」


: w (保存当前文件): wq (输入「wq」,存盘并退出vim) : q! (输入q!,不存盘强制退出vim)


举例:

现在有这么一个tim.c的文件:

image.png


那么现在,我们进去:


执行该条命令:

image.png

进来后,默认进入普通模式(即命令模式)

我们点击i,

,就变成了这样。

我们点击o,就变成了这样:(光标从下一行开始进入insert模式)

 

 

我们点击a,就变成了这样:(即从后一个位置进入插入模式)

如果想要退回到命令模式,那么就直接按Esc.

要想进入底行模式,需要在命令模式下按 :(冒号)

就变成了这样:


然后输入wq(意为保存并退出),再输入回车。


下面的我就不举例了。因为很难动态的表示。请读者自行试一试。


vim正常模式命令集

插入模式

移动光标 vim可以直接用键盘上的光标来上下左右移动,


但正规的vim是用小写英文字母「h」、「j」、「k」、 「l」,分别控制光标左、下、上、右移一格

按「G」:移动到文章的最后

按「 $ 」:移动到光标所在行的“行尾”

按「^」:移动到光标所在行的“行首”

按「w」:光标跳到下个单词的开头

按「e」:光标跳到下个单词的字尾

按「b」:光标回到上个字的开头

按「#l」:光标移到该行的第#个位置,如:5l,56l

按[gg]:进入到文本开始

按「ctrl」+「b」:屏幕往“后”移动一页

按「ctrl」+「f」:屏幕往“前”移动一页

按「ctrl」+「u」:屏幕往“后”移动半页

按「ctrl」+「d」:屏幕往“前”移动半页

删除文字


「x」:每按一次,删除光标所在位置的一个字符

「#x」:例如,「6x」表示删除光标所在位置的“后面(包含自己在内)”6个字符

「X」:大写的X,每按一次,删除光标所在位置的“前面”一个字符

「#X」:例如,「20X」表示删除光标所在位置的“前面”20个字符

「dd」:删除光标所在行

「#dd」:从光标所在行开始删除#行

复制


「yw」:将光标所在之处到字尾的字符复制到缓冲区中。

「#yw」:复制#个字到缓冲区

「yy」:复制光标所在行到缓冲区。

「#yy」:例如,「6yy」表示拷贝从光标所在的该行“往下数”6行文字。

「p」:将缓冲区内的字符贴到光标所在位置。注意:所有与“y”有关的复制命令都必须与“p”配合才能完 成复制与粘贴功能。

替换


「r」:替换光标所在处的字符。

「R」:替换光标所到之处的字符,直到按下「ESC」键为止。 撤销上一次操作

「u」:如果您误执行一个命令,可以马上按下「u」,回到上一个操作。按多次“u”可以执行多次回 复。

「ctrl + r」: 撤销的恢复 更改

「cw」:更改光标所在处的字到字尾处

「c#w」:例如,「c3w」表示更改3个字 跳至指定的行

「ctrl」+「g」列出光标所在行的行号。

「#G」:例如,「15G」,表示移动光标至文章的第15行行首。

Linux编译器:gcc/g++使用

这些指令(包含下面的gdb指令,笔者在这里都不做举例了,因为很难表示动态过程,请读者自行试一试)


背景知识:(我们之前已经说过,可查看下方链接)


1. 预处理(进行宏替换)


2. 编译(生成汇编)


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


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


0基础C语言自学教程——收官之战——第十四节 文件的编译和链接_jxwd的博客-CSDN博客


gcc选项:


-E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面

-S 编译到汇编语言不进行汇编和链接

-c 编译到目标代码

-o 文件输出到 文件

-static 此选项对生成的文件采用静态链接

-g 生成调试信息。GNU 调试器可利用该信息。

-shared 此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库.

-O0

-O1

-O2

-O3 编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高

-w 不生成任何警告信息。

-Wall 生成所有警告信息。

Linux调试器:gdb

背景:


程序的发布方式有两种,debug模式和release模式

Linux gcc/g++出来的二进制程序,默认是release模式

要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项

使用:


list/l 行号:显示binFile源代码,接着上次的位置往下列,每次列10行。

list/l 函数名:列出某个函数的源代码。

r或run:运行程序。

n 或 next:单条执行。

s或step:进入函数调用

break(b) 行号:在某一行设置断点

break 函数名:在某个函数开头设置断点

info break :查看断点信息。

finish:执行到当前函数返回,然后挺下来等待命令

print(p):打印表达式的值,通过表达式可以修改变量的值或者调用函数

p 变量名:打印变量值。

set var:修改变量的值

continue(或c):从当前位置开始连续而非单步执行程序

run(或r):从开始连续而非单步执行程序

delete breakpoints:删除所有断点

delete breakpoints n:删除序号为n的断点

disable breakpoints:禁用断点

enable breakpoints:启用断点

info(或i) breakpoints:参看当前设置了哪些断点

display 变量名:跟踪查看一个变量,每次停下来都显示它的值

undisplay:取消对先前设置的那些变量的跟踪

until X行号:跳至X行

breaktrace(或bt):查看各级函数调用及参数

info(i) locals:查看当前栈帧局部变量的值

quit:退出gdb

Linux项目自动构建化工具:Makefile

会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力

一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作

makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。

make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。

make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。


make是如何工作的,在默认的方式下,也就是我们只输入make命令。那么,


1. make会在当前目录下找名字叫“Makefile”或“makefile”的文件。


2. 如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“hello”这个文件,并把这个文件作为最终的目标文件。


3. 如果hello文件不存在,或是hello所依赖的后面的hello.o文件的文件修改时间要比hello这个文件新(可以用 touch 测试),那么,他就会执行后面所定义的命令来生成hello这个文件。


4. 如果hello所依赖的hello.o文件不存在,那么make会在当前文件中找目标为hello.o文件的依赖性,如果找到则再根据那一个规则生成hello.o文件。(这有点像一个堆栈的过程)


5. 当然,你的C文件和H文件是存在的啦,于是make会生成 hello.o 文件,然后再用 hello.o 文件声明make的终极任务,也就是执行文件hello了。


6. 这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。


7. 在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理。


8. make只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起,我就不工作啦


我们来训练一下:


先创建3个文件,一个Makefile文件

image.png

然后直接上make 就可以

image.pngimage.png



我们让其运行:


当然,Makefile文件也可以这么去写:



零零碎碎的知识比较多,有的可能漏掉了,我会在日后零零散散地将其补齐。


相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
目录
相关文章
|
5天前
|
存储 缓存 监控
Linux缓存管理:如何安全地清理系统缓存
在Linux系统中,内存管理至关重要。本文详细介绍了如何安全地清理系统缓存,特别是通过使用`/proc/sys/vm/drop_caches`接口。内容包括清理缓存的原因、步骤、注意事项和最佳实践,帮助你在必要时优化系统性能。
118 78
|
9天前
|
Linux Shell 网络安全
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
本指南介绍如何利用 HTA 文件和 Metasploit 框架进行渗透测试。通过创建反向 shell、生成 HTA 文件、设置 HTTP 服务器和发送文件,最终实现对目标系统的控制。适用于教育目的,需合法授权。
42 9
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
|
5天前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
49 13
|
6天前
|
Ubuntu Linux C++
Win10系统上直接使用linux子系统教程(仅需五步!超简单,快速上手)
本文介绍了如何在Windows 10上安装并使用Linux子系统。首先,通过应用商店安装Windows Terminal和Linux系统(如Ubuntu)。接着,在控制面板中启用“适用于Linux的Windows子系统”并重启电脑。最后,在Windows Terminal中选择安装的Linux系统即可开始使用。文中还提供了注意事项和进一步配置的链接。
23 0
|
7月前
|
NoSQL 搜索推荐 openCL
【C/C++ 调试 GDB指南 】gdb调试基本操作
【C/C++ 调试 GDB指南 】gdb调试基本操作
418 2
|
23天前
|
NoSQL 编译器 C语言
C语言调试是开发中的重要技能,涵盖基本技巧如打印输出、断点调试和单步执行,以及使用GCC、GDB、Visual Studio和Eclipse CDT等工具。
C语言调试是开发中的重要技能,涵盖基本技巧如打印输出、断点调试和单步执行,以及使用GCC、GDB、Visual Studio和Eclipse CDT等工具。高级技巧包括内存检查、性能分析和符号调试。通过实践案例学习如何有效定位和解决问题,同时注意保持耐心、合理利用工具、记录过程并避免过度调试,以提高编程能力和开发效率。
38 1
|
4月前
|
NoSQL Linux C语言
Linux GDB 调试
Linux GDB 调试
68 10
|
4月前
|
NoSQL Linux C语言
嵌入式GDB调试Linux C程序或交叉编译(开发板)
【8月更文挑战第24天】本文档介绍了如何在嵌入式环境下使用GDB调试Linux C程序及进行交叉编译。调试步骤包括:编译程序时加入`-g`选项以生成调试信息;启动GDB并加载程序;设置断点;运行程序至断点;单步执行代码;查看变量值;继续执行或退出GDB。对于交叉编译,需安装对应架构的交叉编译工具链,配置编译环境,使用工具链编译程序,并将程序传输到开发板进行调试。过程中可能遇到工具链不匹配等问题,需针对性解决。
143 3
|
4月前
|
NoSQL
技术分享:如何使用GDB调试不带调试信息的可执行程序
【8月更文挑战第27天】在软件开发和调试过程中,我们有时会遇到需要调试没有调试信息的可执行程序的情况。这可能是由于程序在编译时没有加入调试信息,或者调试信息被剥离了。然而,即使面对这样的挑战,GDB(GNU Debugger)仍然提供了一些方法和技术来帮助我们进行调试。以下将详细介绍如何使用GDB调试不带调试信息的可执行程序。
132 0
|
6月前
|
NoSQL Linux C语言
Linux gdb调试的时候没有对应的c调试信息库怎么办?
Linux gdb调试的时候没有对应的c调试信息库怎么办?
53 1