Linux中的开发工具(yum,vim,gcc/g++,gdb,Makefile,git)

文章目录

1. Linux软件包管理器------yum

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

和手机上的软件商店类似,我们可以使用 yum 来下载各种我们想要的软件包。使用 yum 时必须联网。

yum 基于 RPM 包管理,能够从指定的服务器自动下载 RPM 包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。

yum 提供了查找、安装、删除某一个、一组甚至全部软件包的命令,而且命令简洁而又好记。

yum 语法

复制代码
yum [options] [command] [package ...]
  • **options:**可选,选项包括-h(帮助),-y(当安装过程提示选择全部为 "yes"),-q(不显示安装的过程)等等。
  • **command:**要进行的操作。
  • **package:**安装的包名。

yum 常用命令

  • 列出所有可更新的软件清单命令:yum check-update
  • 更新所有软件命令:yum update
  • 仅安装指定的软件命令:yum install <package_name>
  • 仅更新指定的软件命令:yum update <package_name>
  • 列出所有可安裝的软件清单命令:yum list
  • 删除软件包命令:yum remove <package_name>
  • 查找软件包命令:yum search
  • 清除缓存命令:
    • yum clean packages: 清除缓存目录下的软件包
    • yum clean headers: 清除缓存目录下的 headers
    • yum clean oldheaders: 清除缓存目录下旧的 headers
    • yum clean, yum clean all (= yum clean packages; yum clean oldheaders) :清除缓存目录下的软件包及旧的 headers

安装 yum 仓库源

  • epel【扩展软件源】
  • ls /etc/yum.repos.d/【查看是否有epel-repo】
  • 系统内如果没有 epel-repo,则需安装yum仓库源 yum install -y epel-release

2. Linux编辑器------vim

vi/vim 都是多模式编辑器,不同的是 vim 是 vi 的升级版本,它不仅兼容 vi 的所有指令,而且还有一些新的特性在里面。例如语法加亮,可视化操作不仅可以在终端运行,也可以运行于 x window、 mac os、windows。

vim 有十二种模式,但是常用的有五种。

本篇文章只讲解这五种模式。

vim 的五种常用模式

  • 正常/普通/命令模式(Normal mode)
    控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入 Insert mode 下,或者到 last line mode
  • 插入模式(Insert mode)
    只有在 Insert mode 下,才可以做文字输入,按「ESC」键可回到命令行模式
  • 底行模式(last line mode)
    文件保存或退出,也可以进行文件替换,找字符串,列出行号等操作。 在命令模式下,「shift + :」即可进入该模式
  • 替换模式【shift + r = R】
  • 视图模式【ctrl + v】

要查看你的所有模式:打开vim,底行模式直接输入help vim-modes

模式切换

vim 基本操作

进入vim,在系统提示符号输入vim 及文件名称后,就进入vim 全屏幕编辑画面。

【注】进入vim之后,是处于 [正常模式],你要切换到 [插入模式] 才能够输入文字。

  • 正常模式\] 切换至 \[插入模式

    输入a(默认定位到光标的下一个位置)

    输入i(默认定位到光标处)

    输入o(默认定位到光标的下一列开头)

  • 插入模式\] 切换至 \[正常模式

    目前处于 [插入模式],就只能一直输入文字,如果发现输错了字,想用光标键往回移动,将该字删除,可以先按一下Esc键转到 [正常模式] 再删除文字。当然,也可以直接删除。

  • 正常模式\] 切换至 \[末行模式

    : (即 shift + ;)

  • 退出 vim 及保存文件,在 [命令模式] 下,按一下 : 冒号键进入 [底行模式]
    :w(保存当前文件)
    :wq(保存并退出 vim)
    :w! (强制保存)
    :q!(不保存强制退出 vim)
    :wq!(强制保存并退出 vim)

命令模式命令集

(1)光标命令

  • vim可以直接用键盘上的光标来上下左右移动,但正规的vim是用小写英文字母「h」、「j」、「k」、「l」,分别控制光标左、下、上、右移一格

  • 按「 $ 」:移动到光标所在行的"行尾"

  • 按「^」:移动到光标所在行的"行首"

  • 按「w」:光标跳到下个字的开头

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

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

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

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

  • 按[shift+g]:进入文本末端

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

  • 按「#G」:表示移动光标至文章的第#行行首。

  • 按「ctrl」+「b」:屏幕往"后"移动一页

  • 按「ctrl」+「f」:屏幕往"前"移动一页

  • 按「ctrl」+「u」:屏幕往"后"移动半页

  • 按「ctrl」+「d」:屏幕往"前"移动半页

(2)复制粘贴命令

  • 「yw」:将光标所在之处到字尾的字符复制到缓冲区中,即复制单词【「nyw」复制 n 个单词到缓冲区】
  • 「yy」:复制光标所在行到缓冲区。【可以 nyy 复制 n 行】
  • 「p」:将缓冲区内的字符贴到光标所在位置【注意:所有与"y"有关的复制命令都必须与"p"配合才能完成复制与粘贴功能】【可以「np」粘贴 n 次】

(3)撤销与重做

  • 「u」:如果您误执行一个命令,可以马上按下「u」,回到上一个操作。按多次"u"可以执行多次回复。
  • 「ctrl + r」:撤销的恢复【对 ctrl + r 后悔,还按 u】

(4)删除

  • 「x」:每按一次,删除光标所在位置的一个字符【可以 nx 删除后面 n 个字母】
  • 「X」:大写的X,每按一次,删除光标所在位置的 "前面" 一个字符【可以 nx 删除前面 n 个字母】
  • 「dd」:删除光标所在行【和 p 配合,实现剪切】【可以 ndd 剪切 n 行】

(5)替换

  • 「r」:替换光标所在处的字符【支持 nr 用一个字符替换多个字符】
  • 「R」:进入替换模式,替换光标所到之处的字符,直到按下「ESC」键为止

(6)其他命令

  • 「shift + ~ 」:自动切换字母大小写
  • 「shift + # 」:自动查询选出和光标所在单词相同的所有单词,按 n 倒着查看下一个

底行模式命令集

(1)设置与取消行号

设置行号在底行模式输入:set nu

取消行号在底行模式输入:set nonu

(2)保存并退出

:w(保存当前文件)
:wq(保存并退出 vim)
:w! (强制保存)
:q!(不保存强制退出 vim)
:wq!(强制保存并退出 vim)

(3)查找字符

在底行模式输入:/关键字

此关键字会语法高亮出来,若这个关键字不是你想找的那个,可以按n键跳到下一个关键字位置。

(4)其他

可以在底行模式下执行 Linux 命令语句。

如:

  • !gcc test.c(加了!,不退出 vim 直接编译)
  • !./a.out(加了!,不退出 vim 直接运行)

替换模式

命令模式下输入:shift + r

在此模式下,所有的输入都会被当作替换,替换完成后按 Esc即可。

视图模式

命令模式下输入:ctrl + v

在左下角显示visual就代表进入了视图模式

注释

在视图模式下用h j k l选中要注释的行,选好后用shift +i进入插入模式,再输入//Esc退出,注释完成。

取消注释

进入视图模式,用h j k l选中要取消注释区域的前两列,按d,即可删除注释。

vim 下的多线程操作

vim 文本编辑器可以同时打开多个文件,在vim的底行模式下输入:vs 想要打开的文件名

虽然说有多个文件,但是光标只有一个,光标在哪个文件,现在就在编辑哪个文件。

切换文件

使用指令:ctrl + ww

vim 配置

在普通的 vim 编辑器下,我们写代码会非常别扭,没有换行,没有高亮,没有缩进······

在此,给大家推荐一个基于 C/C++ 非常好用的 vim 编辑器配置。

链接:vimforcpp

安装方法

3. Linux编译器------gcc/g++

  • gcc:C语言编译器,只能编译C语言。
  • g++:C++编译器,C/C++都能编译。

除此之外,gcc/g++还有链接的功能,可以直接生成可执行程序。

一个C/C++程序形成可执行文件的过程

分为四步:

(1)预处理:进行宏的替换、头文件展开、注释的删除(空格替换)。

(2)编译:将代码转化为汇编代码(这个阶段主要负责语法分析、符号汇总、 词法分析、 语义分析)。

(3)汇编:将汇编代码转化为二进制机器指令,生成符号表。

(4)链接:汇编完成后会把对应源文件生成目标文件,链接阶段就是把这些目标文件进行链接。

gcc/g++ 的使用

  • 格式

gcc [选项] 要编译的文件 [选项] [目标文件]

  • 直接形成可执行程序

gcc/g++ test.c -o test.exe

注意:-o选项用于指定生成的可执行文件的名称。这个选项后面需要跟上一个文件名作为参数,不加-o选项的话自动生成,默认生成的可执行程序的名称是a.out。

  • 使用C99标准编译

gcc test.c -std=99

  • 预处理(进行宏替换,条件编译)

gcc -E test.c -o test.i
注意:经过预处理的文件以.i为后缀。

  • 编译(生成汇编代码)

gcc --S test.i --o test.s

  • 汇编(生成二进制机器码)

gcc --c test.s --o test.o

  • 链接(生成可执行程序)

gcc test.o --o test.exe

  • gcc其它选项

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

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

  • 运行可执行程序

    ./test.exe

    注:.表示在当前目录下寻找可执行程序。

函数库

我们的C程序中,并没有定义printf的函数实现,且在预编译中包含的stdio.h中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实现printf函数的呢?

于是就引出了函数库的概念,系统把这些函数实现都放在了为libc.so.6的库文件中去了,在没有特别指定时,gcc 会到

系统默认的搜索路径/usr/lib下进行查找,也就是链接到libc.so.6库函数中去,这样就能实现printf函数了,而这也就是链接的作用。

函数库一般分为静态库和动态库两种。

静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为.a

动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为.so,如前面所述的libc.so.6就是动态库。gcc 在编译时默认使用动态库。完成了链接之后,gcc 就可以生成可执行文件。

对于库名字的解释:(以libc.so.6为例)lib为前缀,c为库名字也就是C语言标准库,.so.6后缀与版本号。

  • Linux下: .so 是动态库 .a 是静态库
  • Windows下: .ddl 是动态库 .lib 是静态库

查看一个可执行程序依赖的第三方库:ldd 可执行程序名

动静态库的优缺点

动静态库的区别是:

  • 动态库是共享库,通过函数地址来关联程序
  • 静态库是通过代码拷贝,从而形成私有库,可以独立运行

优缺点:

动态库:

  • 优点:形成的可执行程序体积较小,节省资源
  • 缺点:要找函数地址,会稍慢一点,并且有强依赖性

静态库:

  • 优点:无视库,可以独立运行
  • 缺点: 体积太大,浪费资源
    我们编译代码时不指定说明默认使用动态库。

如果你想使用静态库编译代码:gcc test.c -static

gcc/g++ 选项

  • -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调试,必须使用debug模式编译,即在源代码生成二进制程序的时候,加上 -g 选项

1. 安装gdb

  • sudo yum -y install gdb

2. gdb的使用

进入调试:gdb 可执行程序

退出调试:ctrl + dquit

调试命令:

  • list/l 行号:显示binFile源代码,接着上次的位置往下列,每次列10行。
  • list/l 函数名:列出某个函数的源代码。
  • r或run:运行程序。
  • n 或 next:单条执行。
  • s或step:进入函数调用
  • break(b) 行号:在某一行设置断点
  • break 函数名:在某个函数开头设置断点
  • info break :查看断点信息。
  • finish:执行到当前函数返回,然后挺下来等待命令
  • print§:打印表达式的值,通过表达式可以修改变量的值或者调用函数
  • 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:查看当前栈帧局部变量的值

Linux项目自动化构建工具------make/Makefile

  • 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。
  • makefile带来的好处就是------"自动化编译",一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
  • make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。
  • make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。

用法

makefile是一个具有特定格式的文本文件。

首先在当前目录下创建一个Makefile,再用 vim 编辑。

假设我们已经写好了C程序test.c,我们想通过Makefile文件来调用编译、删除等指令,我们可以写以下代码:

复制代码
mybin:test.c
	gcc test.c -o mybin
.PHONY:clean
clean:
	rm -rf mybin

格式注意:第二行是以tab键开头,不能以空格开头。

保存退出 vim,接下来,我们只需要输入make就会执行gcc test.c -o mybin指令编译形成可执行程序mybin,使用make clean就会执行rm -rf mybin指令删除mybin

理解

在上面用法中输入make指令,其实等同于输入了make mybin。这是因为单独输入make,会从上到下扫描Makefile文件,执行其第一个指令。要想执行后面的指令,则需要像上面的make clean一样,输入make 操作名

伪目标的概念及性质

在上面Makefile文件中,我们写了这样的代码:.PHONY:clean

.PHONY是将clean指令修饰成了伪目标。

clean被修饰后,只要我们输入一次make clean,就会执行一次rm -rf mybin。而没有被修饰成伪目标的mybin,执行完第一次,执行第二次时由于已经是最新编译结果了,则不会再执行。


我们得出结论:被修饰成伪目标后,此文件总是被执行

文件的时间属性

操作系统是如何知道我们的 test.c 是否被修改,从而驳回我们的make请求的呢?答案一定是文件的时间属性!!!

我们知道,先有源文件后才有可执行程序,所以源文件的修改时间一定小于可执行文件的修改时间。在第二次make时,操作系统发现源文件的修改时间小于可执行程序的修改时间,所以驳回了make请求。同理,修改源文件后,源文件的修改时间大于可执行文件的修改时间,所以操作系统会重新执行make

查看文件属性

使用指令: stat 文件名

注意:

文件 = 内容 + 属性

修改文件的内容可能会影响文件的属性,修改文件的属性不会影响文件的内容。

Makefile 推导能力

举例

复制代码
mybin:test.o
    gcc csdn.o -o mybin 
test.o:test.s
    gcc -c csdn.s -o test.o
test.s:test.i
    gcc -S code.i -o test.s
test.i:test.c
    gcc -E csdn.c -o test.i 

首先,mybin依赖的是test.o文件但是系统中此时没有test.o文件,就会执行下一条指令,但是test.o文件依赖的是test.s文件,系统中此时没有test.s文件又会跳到下一条指令,以此往复直到找到系统中存在的test.c文件,再倒推回去。

Makefile 定义变量

操作方法

复制代码
target=mybin
cc=gcc
src=test.c
$(target):$(src)
	$(cc) $(src) -o $(target)
.PHONY:clean
clean:
	rm -rf $(target)
  • 可以用$^代表依赖关系的左边
  • 可以用$@代表依赖关系的右边

如:

复制代码
mybin:test.c
     gcc $@ -o $^
.PHONY:clean
clean:
     rm -rf mybin

如果你不想一条指令被打印在显示器,可以在指令前加上@符号。

git

安装git

yum install git

git 四板斧

  • git clone + 仓库链接【克隆远端仓库到本地】
  • git add .【增加当前目录下所有新文件至本地仓库】
  • git commit -m "日志"【注:提交时必须 -m 带日志】
  • git push【推送到远端仓库】

git 其他命令

  • git log【查看提交日志、提交记录】
  • git pull【同步远端和本地仓库】
  • git status【查看本地仓库状态】
相关推荐
伤不起bb2 小时前
MySQL 高可用
linux·运维·数据库·mysql·安全·高可用
大大小小聪明4 小时前
Git合并多个提交方法详解
git·github
tmacfrank5 小时前
网络编程中的直接内存与零拷贝
java·linux·网络
QQ2740287568 小时前
Soundness Gitpod 部署教程
linux·运维·服务器·前端·chrome·web3
qwfys2008 小时前
How to configure Linux mint desktop
linux·desktop·configure·mint
南方以南_8 小时前
Ubuntu操作合集
linux·运维·ubuntu
冼紫菜9 小时前
[特殊字符]CentOS 7.6 安装 JDK 11(适配国内服务器环境)
java·linux·服务器·后端·centos
Chuncheng's blog10 小时前
RedHat7 如何更换yum镜像源
linux
爱莉希雅&&&10 小时前
shell脚本之条件判断,循环控制,exit详解
linux·运维·服务器·ssh
wei_work@10 小时前
【linux】Web服务—搭建nginx+ssl的加密认证web服务器
linux·服务器·ssl