Linux 10分钟掌握Linux常用开发工具及编译的四个过程_sts能编译c文件吗(1)

最后的话

最近很多小伙伴找我要Linux学习资料,于是我翻箱倒柜,整理了一些优质资源,涵盖视频、电子书、PPT等共享给大家!

资料预览

给大家整理的视频资料:

给大家整理的电子书资料:

如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以点击这里获取!

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

Linux下的常用开发工具

软件包管理工具

yum–类似于手机上的应用商店(管理当前系统中能够安装的工具以及卸载的工具,并且实现安装及卸载操作)
1、查看所能安装的软件:yum list 查看所有工具;yum search keyword 根据关键字查找指定的工具
2、安装一个指定的权健工具:yum install package_name
3、卸载已经安装的软件工具:yum remove package_name
推荐下载工具 gcc、gcc-c++、gdb、git、lrzsz

lrzsz工具:rz从主机传文件到传到虚拟机当前路径;sz filename将filename文件传输到主机中

编辑器

在linux下有很多编辑器,最常用的是vim
vim test.txt 打开test.txt文件
vim中默认不能使用鼠标,所以只能通过键盘完成;因此为了完成各种各样的操作(复制粘贴,数据修改…),因此vim分出了多种操作模式,不同的操作模式下,相同的按键有不同的功能。

vim操作模式分类:共有12种,最常用的是三种–普通插入底行
普通模式:完成文本的操作,以及光标的移动操作,其他指令操作。
插入模式:插入数据
底行模式:我们这里更多用于保存退出文件

模式切换:vim filename 打开文件后,默认处于普通模式
普通–>插入 按i光标在哪就从哪里插入;按o在光标所在行新建一行插入;
插入–>普通 ESC键盘左上角 (任意模式下按ESC键都可以回到普通模式下)
普通–>底行 按:(英文冒号)常用操作 w 保存 q退出 wq保存并退出 q! 不保存强制退出 (用于打开并修改了只读文件)

普通模式下的常用操作:
光标移动操作:hjkl-左下上右 ctlr+f/b-向下/上翻页 gg/G-文档首行和末尾行 $-移动到光标所在行末尾
文本内容操作:yy / nyy-复制当前行/复制n行 p / np粘贴一次 / 粘贴n次 dd / ndd剪切光标所在行 / 剪切n行 x删除光标所在字符 dw删除单词
其他典型操作:u撤销上一次操作 ctrl+r反向撤销 gg=G全文对齐 set nu显示行号 /strname查找含有strname字符串所在行,n向下查找/N向上查找

vim 基本配置

输入vim ./vimrc 切换到插入模式,输入一下代码,保存并退出

   set ts=4
   if has("autocmd")
   filetype indent on
   autocmd FileType \* setlocal ts=4 sts=4 sw=4 ai et nu
   autocmd FileType \* setlocal ts=4 sts=4 sw=4 noet nu
   endif


扩展:vim打开一个文件后,通常会创建一个临时文件,以.sw*结尾,vim打开文件后,创建临时文件,编辑的时候会修改这个临时文件,只有在保存的时候,才回将修改的信息,写入到源文件中。例如打开a.txt文件,会创建一个临时文件.a.txt.swp 。注意:正常退出vim的时候会删除临时文件,在文件没有正常关闭退出vim时,这个临时文件不会被删除,会一直存,且每次打开源文件都会提示信息。这时候退出删除这个隐藏的临时文件即可。

编译器

gcc C语言编译器/ g++ C++语言编译器
在编程时所用的C、C++语言都属于高级语言,不是cpu指令,这种语言无法直接被cpu识别。而这种语言的出现的目的,是为了简化编程,并且实现扩平台移植性(一段程序能够在不同的平台上编译后运行)。上层使用统一语言的语法规则,构建不同语言,然后不同语言拥有不同的编译器,将上层高级语言代码解释为对应平台的cpu指令,能够被cpu识别执行。

编译的过程:将高级语言代码解释为机器指令经过了哪些阶段

1、预处理阶段:展开所有代码(引入头文件,宏替换,删除注释…)但不检查语义语法
gcc -E test.c -o test.i 只进行预处理阶段,并将预处理后的文件写到test.i文件中
2、编译阶段:检查语义语法规错误,如果没有错误则将C语言解释为汇编语言
gcc -S test.i -o test.s 只进行编译处理,并将编译处理后的文件写到test.s文件中
3、汇编阶段: 将汇编代码解释为二进制的cpu指令
gcc -c test.s -o test.o 只进行汇编处理,并将汇编处理后的文件写到test.o文件中
4、链接阶段: 将所有的指令代码打包到一起(不仅是打包我们自己的代码,还有链接文件中的库函数指令代码),进行组织成为可执行程序
gcc test.o -o test.exe 进行链接处理,并将链接后的文件写到test.exe文件中

在linux系统下,可以直接链接然后执行可执行文件,并不是说没有前面的三个阶段。内部其实也是都经历了这四个阶段 gcc test.c -o test.exe
:通常被认为是库函数,说白了就是一个文件,文件中包含大量的函数实现(比如我们所使用的printf函数)
代码中用到了标准库中的printf函数,则生成可执行程序时就必须能够知道printf的具体指令,这就是链接库的必要性。
库分为动态库静态库

库的链接方式:gcc / g++编译器默认的链接方式是动态链接
动态链接:链接动态库生成可执行程序,并没有把库中函数的实现指令直接拿过来写入可执行程序中,而是在可执行程序中记录了库中函数的符号信息表,在运行可执行程序的时候再去加载动态库到内存中,如果动态库不存在,则程序无法运行。
静态链接:链接静态库生成可执行程序,直接将库中我们用到的函数的实现代码指令,写入到了可执行程序文件中,程序运行的时候没有什么依赖。
在这里插入图片描述
动态链接的优缺点:生成的可执行文件比较小,运行时态库被加载到内存中,可以多个程序使用同一份内存中库函数代码;缺点是运行时需要依赖动态库的存在,不存在则无法运行,装载速度慢。

静态链接的优缺点:程序运行没有其他依赖,可以直接运行;装载速度快,但是可执行程序比较大,并如果多个程序使用同一个库中的函数,则这个函数的代码在运行时内存就会有多份相同的库函数代码,会造成冗余。

gdb调试器

调试器的功能:调试,观察程序的运行过程,排查程序的运行错误。
程序的错误分类:编译错误,链接错误,运行时错误(代码逻辑不对及运行时崩溃)。
我们大家在windows都用过vs吧,我们调试都是直接按F10,F11。但是并不是所有情况下都可以调试,程序分为debug版本和release版本,debug是不对进行优化,并且假如了程序调试信息,而release不包含调试信息,会对程序进行优化。vs中默认是debug版本,而在linux下默认是release版本。如果我们想在linux下调试程序,那么我们必须将程序改为debug版本,在链接时在文件前加-g
示例:gcc -g test.c -o test.exe
在linux下我们的调试工具就是gdb调试器,下面我们来了解它。
gdb常用调试指令
流程控制
gdb ./test.exe 进入调试
quit退出调试
run 直接运行程序 简写r
start 开始逐步调试
list查看调试行附近代码 list nn为行号,查看第n行附近代码 list file : n 查看文件file的第n行附近代码 简写l
next逐过程,遇到函数直接运行完毕 简写n
step逐语句,遇到函数会进入函数 简写s
until n直接运行到第n行的位置 ,until file :n运行到文件file的第n行
continue从当前调试位置直接运行,直到断点或者程序运行完毕 简写c
break n打断点 break file : n在文件file的第n行打断点 break funtion_name在函数第一行打断点 简写b
info break 查看断点信息 i b
delete 删除全部断点 delete n删除断点ID为n的断点 简写d
watch variable_name变量监控断点,当变量发生改变时停下来

内存控制
print var_name 查看变量内容 print var_name=val设置变量内容 简写p
backtrace查看函数调用栈–通常用于检测程序运行时崩溃位置 简写b 栈顶位置就是程序崩溃的位置

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

Makefile:是一个文本文件,记录一个项目的构建规则流程
make:是一个解释程序,对Makefile记录的构建规则流程逐步解释执行,完成项目的构建

Makefile的编写规则:

目标对象:依赖对象
[缩进]  生成目标对象的指令
test : test.c
	gcc test.c -o test

在命令行中敲击make指令,则表示运行make解释程序,程序会在当前目录下找到名称为makefile的文件,解释执行其中的项目构建规则。
预定义变量的使用:用于指令中
$@ 表示目标对象
$^ 表示所有依赖对象
$< 表示依赖对象的第一个

test : test.c test1.c test2.c
	gcc $^ -o $@
	上述指令等价于
	gcc test.c test1.c test2.c -o test

在规则中,找到要生成的以第一个目标对象(判断目标对象是否已经存在,存在的话是否需要重新生成,根据依赖文件的最后一次修改时间最对比)然后执行对象生成的指令。
$(wildcard ./*.c) 获取当前目录下所有以,c结尾的文件的文件名称
$()对括号内的变量的使用

src=$(wildcard ./ \*.c)
test : $(src)
	gcc $^ -o $@
与上一例子代码功能一样

程序的编译过程有4部分:预处理,编译,汇编,链接。而在项目构建中整体会分为两步—编译与链接。好处是如果值修改了一个.c文件,就不用全部文件都编译,以前是直接对所有.c文件进行编译生成可执行程序,效率低下。因此分为两步进行操作,先把每个.c文件生成自己的.o文件,然后再把所有的.o文件链接到一起,一旦一个.c文件改变,只需要对这个.c文件进行编译生成.o文件,重新链接一次就可以生成可执行文件(其他文件不需要编译)

test.o : test.c
	gcc -c $^ -o $@
test1.o : test1.c
	gcc -c $^ -o $@
test2.o : test2.c
	gcc -c $^ -o $@
test : test.o test1.o test2.o
	gcc $^ -o $@

make每次在makefile中只会找到第一个目标对象进行生成,生成之后就会推出(也就是不会去生成第二个目标对象)如果按以上代码,则只会生成test.o文件,并不会生成test1.o test2.o test文件。但是修改成一下代码,就可以正确生成我们想要的代码:

test : test.o test1.o test2.o
	gcc $^ -o $@
test.o : test.c
	gcc -c $^ -o $@
test1.o : test1.c
	gcc -c $^ -o $@
test2.o : test2.c
	gcc -c $^ -o $@

将最后一步链接的指令放到第一个对象的位置,在生成目标对象时,会去查找依赖对象的生成规则,先生成依赖对象,再去生成目标对象。以上代码还可以进行优化:

最后的话

最近很多小伙伴找我要Linux学习资料,于是我翻箱倒柜,整理了一些优质资源,涵盖视频、电子书、PPT等共享给大家!

资料预览

给大家整理的视频资料:

给大家整理的电子书资料:

如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以点击这里获取!

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!**

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以点击这里获取!

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值