linux环境基础开发工具详细使用(yum、vim、gcc/g++、gdb、make、git)

1 Linux 软件包管理器 yum

什么是软件包?
  在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序.但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在一个服务器上, 通过包管理器可以很方便的获取到这个编译好的软件包, 直接进行安装.软件包和软件包管理器, 就好比 “App” 和 “应用商店” 这样的关系.
  yum(Yellow dog Updater, Modified)是Linux下非常常用的一种包管理器. 主要应用在Fedora, RedHat,Centos等发行版上.
注意事项
  关于 yum 的所有操作必须保证主机(虚拟机)网络畅通!!!,可以通过ping指令验证:ping www.baidu.com

yum的N板斧—前提是需要切换到root用户

  • yum install [软件名称]
  • yum remove [软件名称]
  • 可以查看当前“应用商店”都有哪些软件
    在这里插入图片描述

关于 rzsz
  例如使用yum list,可以查看当前的所有应用软件,使用yum list | grep [xxx] ,"|"为管道,可以过滤上级的结果作为下级的输入将我们需要的软件名称传递给grep命令,然后再进行输出
  例如安装:yum install -y lyzsz,安装后有如下指令
rz指令:
  可以将win本地的文件上传到linux中
sz [filename]
  可以将linux的文件下发到win本地

查看软件包
  指令:yum list | grep lrzsz
  结果: lrzsz.x86_64 0.12.20-36.el7 @base

注意事项:

  • 软件包名称: 主版本号.次版本号.源程序发行号-软件包的发行号.主机平台.cpu架构.
  • “x86_64” 后缀表示64位系统的安装包, “i686” 后缀表示32位系统安装包. 选择包时要和系统匹配.
  • “el7” 表示操作系统发行版的版本. “el7” 表示的是 centos7/redhat7. “el6” 表示 centos6/redhat6.
  • 最后一列, base 表示的是 “软件源” 的名称, 类似于 “小米应用商店”, “华为应用商店” 这样的概念.

2 Linux编辑器-vim使用

vim格式:vim [filename]
三种模式:

  • 普通模式:控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode
  • 插入模式:只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式
  • 低行模式:文件保存或退出,也可以进行文件替换,找字符串,列出行号等操作。 在命令模式下,shift+: 即可进入该模式。要查看你的所有模式:打开vim,底行模式直接输入:help vim-modes。

三种模式之间转换图:
在这里插入图片描述
在编辑当中有7字箴言,每一个字代表vim当中的一个操作,熟悉之 后对操作是如虎添翼:移删复替撤更跳
在普通模式下:

  1. 移动:
      gg: 回到文本的首部 G:移动到当前文本的尾部 调整代码格式:gg=G
  2. 删除:
      删除单个字符:x:删除光标当前所在字符 X:删除光标前的一个字符
      删除行:dd:删除光标所在行的数据    [num] dd:删除光标所在行向下数num行的数据
  3. 复制:
      行数据:yy:复制光标所在行的数据   [num] yy:从光标所在行开始,复制 num行
      粘贴:p: 向光标的下一行去粘贴   p: 向光标上一行粘贴
  4. 替换:
      r: 先按r,再按想要替换的字符   R: 先按R,再替换想要替换的多个字符
  5. 撤销:
      u:撤销上一次动作   反撤销:Ctrl+r
  6. 更改:
      cw: 更改光标当前所在字,并且会进去插入模式
  7. 跳转:
      [num] G:跳跃到第几行

vim的底行模式命令

  • :set nu 设置行号 :set nonu 取消行号
  • :%s/[dest]/[src]/g 将dest全文替换成为src,其中s代表search,g代表全文
  • :%s/[dest]/[src]/g 将光标所在行中dest全部替换为src
  • :[num1,num2]s/[dest]/[src]/g 将num1到num2中所有的dest替换成为src
  • :vs [filename] 打开filename文件,并和当前文件分页
  • ctrl + ww 光标所在不同的分页当中来回切换

3 Linux编译器-gcc/g++使用

gcc – >编译C代码 g++ – > 编译C++代码
1. 背景知识

  1. 预处理(进行宏替换)
  2. 编译(生成汇编)
  3. 汇编(生成机器可识别代码)
  4. 连接(生成可执行文件或库文件)

2. gcc如何完成
格式 gcc [选项] 要编译的文件 [选项] [目标文件]

预处理(进行宏替换)
展开头文件,宏替换,去注释,条件编译
语法:gcc/g++ -E [源码文件] -o [预编译处理后文件名称].i
实例:gcc -E test.c -o test.i 将test.c文件预处理为test.i文件

编译(生成编译)
语法语义的检测,生成了汇编代码
语法:gcc/g++ -S [源码文件] -o [编译之后的文件名称].s
实例:gcc -S test.c -o test.s 将test.c文件编译为test.s文件

汇编(生成机器可识别代码)
将汇编代码转换成机器代码
语法:gcc/g++ -c [源码文件] -o [汇编之后的文件名称].o

链接(生成可执行文件或库文件)
将生成程序需要的所有.o文件,链接在一起,生成可执行程序
语法:gcc/g++ [xxx].o -o []

最后,也可直接生成可执行程序文件,不需要经过上述的预处理、编译、汇编、链接等过程,语法如下:
语法:gcc/g++ [源码文件] -o [生成可执行程序文件]

在这里涉及到一个重要的概念:函数库
  我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实“printf”函数的呢?
  最后的答案是:系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了,在没有特别指定时,gcc 会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函数“printf”了,而这也就是链接的作用。

函数库一般分为静态库和动态库两种
  静态库是指编译链接时,把库文件的代码全部加入到可执行文件中, 因此生成的文件比较大, 但在运行时也就不再需要库文件了。其后缀名一般为“.a”
  动态库与之相反 ,在编译链接时并没有把库文件的代码加入到可执行文件中 ,而是在程序执行时由运行时链接文件加载库, 这样可以节省系统的开销。动态库一般后缀名为“.so” ,如前面所述的libc.so.6 就是动态库。gcc在编译时默认使用动态库。完成了链接之后,gcc就可以生成可执行文件,如下所示。gcc hello.o –o hello
  gcc默认生成的二进制程序,是动态链接的,这点可以通过file命令验证。

以下是加图片的详述
首先用ldd test命令输入后观察系统库文件的相关内容,ldd test查看动态库文件后如下:在这里插入图片描述
libstdc++.so.6 —> C++为我们程序员提供的动态库文件
libc.so.6 —> C语言为我们程序员提供的动态库文件

静态链接:需要增加命令行参数 -static
在这里插入图片描述
  其中test为动态文件,test1为静态文件,静态文件的大小要比动态文件的大小大的多,是因为动态链接的时候动态库和动态文件没有在一起,每次执行的时候需要单独去动态库调用,所以生成的可执行文件就比价小。相反的静态文件和静态库在一块,执行的时候则只需要链接库文件就可生成可执行文件。相关图形如下所示:
在这里插入图片描述
也可以用file test查看文件的属性,查看动态文件后如下:
在这里插入图片描述
查看静态文件后如下:
在这里插入图片描述

4 LInux调试器-gdb使用

1. 背景
程序的发布方式有两种,debug模式和release模式,Linux gcc/g++出来的二进制程序,默认是release模式,要使用gdb调试,必须在源代码生成二进制程序的时候, 加上-g选项。
实例 :g++ test.cpp -o test -g 生成realease模式

2. 开始调试
调试语法:gdb [可执行程序]
list/l 行号:显示binFile源代码,接着上次的位置往下列,每次列10行
list/l 函数名:列出某个函数的源代码
r或run:运行程序
n或next:单条执行,逐过程,相当于vs中的f10
s或step:进入函数调用,逐语句,相当于vs中的f11
(b) breakpoint 行号:在某一行设置断点
break 函数名:在某个函数开头设置断点
(i b)info break :查看断点信息
finish:执行到当前函数返回,然后挺下来等待命令
§print:打印表达式的值,通过表达式可以修改变量的值或者调用函数
p (print)变量:打印变量值
set var:修改变量的值
continue(c):继续执行,在vs中的f5
run(r):让程序跑起来
delete:删除所有断点
delete [断点序号]:删除序号为n的断点
disable [断点序号]:禁用断点
enable [断点序号]:启用断点
(i) info breakpoints:参看当前设置了哪些断点
display 变量名:跟踪查看一个变量,每次停下来都显示它的值
undisplay:取消对先前设置的那些变量的跟踪
until X行号:跳至X行
(b t)breaktrace:查看各级函数调用及参数
(i)info locals:查看当前栈帧局部变量的值
quit:退出gdb

3. 程序崩溃产生coredump文件
  coredump文件叫核心转储文件。保存的是程序在崩溃之前正在做的事情,已经改变各个变量之间的内容;
            在这里插入图片描述
在这里插入图片描述
coredump文件查看语法:gdb [可执行程序] coredump
bt : 查看调用堆栈
在这里插入图片描述
代码在27行产生了问题
如果有coredump文件,则常见的错误:
  段错误:如果有11号信号 - -> 考虑代码是否访问内存越界,考虑代码的是否访问空指针
  double free:6号 - -> 考虑是否重复释放
在终端中输入:ulimit -a,查看linux操作系统的限制信息
在这里插入图片描述
core file size (blocks, -c) 0
coredump文件的大小取决于core file size的大小 ---- 软件限制
如何修改:ulimit -c unlimited ----> 修改成没有限制的,再次输入ulimit -a,查看Linux操作系统的限制信息
在这里插入图片描述

  假如程序崩溃,系统产生了50G大小的文件,而core file size的大小为0,就不会产生核心转储文件了,假如core file size没有限制,则最后系统程序崩溃,系统则会产生核心转储文件。但另一方面产生的核心转储文件又由硬件的磁盘限制,假设磁盘只剩下2g,而产生的核心转储文件有5g,则也不能产生核心转储文件。

5 Linuxx项目自动化编译工具–make/makefilr

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

详述

1. make是自动化解释工具,解释Makefile文件内容
2. Makefile编写规则
目标对象:想要生成的目标对象
依赖对象:生成目标对象的时候依赖哪些文件,这些文件被称之为依赖对象
编译命令:使用依赖对象生成目标对象的方法
编写规则如下:
在这里插入图片描述
实例:1 首先建立一个名为test.cpp文件,并且让其输出“舒服”两字;
   2 使用 vim makefile打开Makefile文件,其中M大小写不做区分;
   3 按照上图格式输入;
在这里插入图片描述
  4 保存并返回,输入make,产生out输出文件,随后用ls查看
在这里插入图片描述
  5 输出文件 ./out --> 舒服
在这里插入图片描述
3. make解释Makefile的规则
3.1 对比目标对象和依赖对象最后一次的修改时间
  3.1.1 如果目标对象最后一次的修改时间比较新,则认为目标对象比价新,不需要重新生成目标对象
  3.1.2 反之,则重新生成
3.2 永远只为了生成第一个目标对象而服务
         在这里插入图片描述
此时生成的目标对象是test文件,而不是out文件
若要同时生成多个目标文件,语法 --> 伪目标:可执行程序A 可执行程序B,如下所示:
         在这里插入图片描述
退出保存后,make命令进行自动化编译,可以看到同时编译两个目标文件,并最后生成:
         在这里插入图片描述
3.3 如果依赖对象不存在,则会在当前的Makefile的编写规则当中查找生成依赖对象的方法

4. 预定义变量

  • $^:所有依赖对象
  • $@:目标对象
  • $< :第一个依赖的对象
             在这里插入图片描述
    Makefile进行清理,clean命令,最后保存退出,再输入make clean就可以实现清理:                在这里插入图片描述

6 git版本管理工具

管理代码仓库
1. 克隆远端仓库到本地,推送文件到远端仓库
git clone [url] --> 将GitHub中仓库克隆到当前的某个文件夹中
   1.1 git标记:git add [filename/foldername]
   1.2 提交到本地仓库:git commit -m “本次提交的日志信息”
   1.3 推送到远端仓库:git push origin master
2. 删除远端仓库的内容
   2.1 删除本地仓库文件:git rm [filename]
   2.2 提交远端git:git commit -m “xxxx”
   2.3 推送远端git:git push origin master
3. 将远端内容发送到本地Linux机器仓库中

猜你喜欢

转载自blog.csdn.net/aaaaauaan/article/details/107573497