【Linux】Linux编程-gcc,gdb,makefile篇

【Linux】Linux编程-gcc,gdb,makefile篇

  在介绍了vim的使用后我们已经可以在Linux中的vim书写代码了,但是如果想要vim使用更加舒畅我们还需要向vim的配置文件中增加相关配置才行,这些都交给大家自行选择了。但是真正想要在Linux中运行代码光靠vim是不够的,我们还需要编译器,调试器,以及文件管理工具共同配合才行。

gcc

  在Linux中我们有现成的编译器可供我们使用,这个编译器就是gcc,gcc的编译标准是C标准委员会所提供的最为官方的编译准则,因此学会使用gcc的使用后我们不光可以在Linux中使用gcc编程也可以在Windows下使用记事本+gcc的方式进行编程。

基本指令

  我们可以使用man gcc打开gcc的说明文档,可以发现,gcc的使用还是比较复杂的,里面有各种指令选项可供我们选择,但是大多的选项我们目前还使用不到,最为常用的语法大家只需要记住一条即可。

  gcc 文件名.c -g -o 编译结果文件名

  -o选项是改名选项,我们在后面跟上自己目标想要使用的名字即可。如果不适用-o选项会自动将结果命名为a.out-g则是生成Debug版本方便我们后面用gdb进行调试。

编译过程

  在之前我们在Windows下使用ide进行编程的时候,我们总是一个编译运行,ide就自动执行整个编译过程并且执行显示结果了,我们往往无需关心编译过程中编译器都做了哪些事情,但是在Linux下编程的时候往往就更能感受到编译器在编译过程中都做了哪些事,这个过程对我们来说也显得更为重要。

  1、宏替换

  在这个过程下,编译器会将我们在.c文件中以#开头的宏定义和引入头文件预先编译一遍并且加到代码中,这也是以#开头的语句我们叫他预处理语句的原因。我们可以对一个.c文件执行以下命令。

  gcc -E 文件名.c -o 结果文件名.i

  执行过后就会发现当前目录下产生了预处理过后的.i文件,用vim打开文件会发现代码与我们之前所书写的略有不同,因为所有的预处理指令都不见了,因为他们已经和我们所写的代码结合起来了。在这条指令中-E预处理选项

  2、编译

  编译过程是将我们之前生成的预处理结果.i文件转换为汇编语言文件的过程,这是一个将高级语言向底层转换的过程。

  gcc -S 文件名.i -o 结果文件名.s

  执行过语句过后目录下便会出现编译过后的.s汇编语言文件,用vim打开后会发现我们的代码已经全部转换为汇编语言的版本了。-S是汇编选项。

  3、汇编

  汇编过程是将我们之前生成的汇编文件转换为机器码的过程,因为我们的计算机只认得机器码,也就是二进制文件,因此我们还需做一步转换才能让计算机识别。

  gcc -c 文件名.s -o 结果文件名.o

  要注意这条语句中的-c是小写的,之前的命令中-S-E都是大写。在这条语句执行过后我们就会发现目录下多出了-o二进制文件,也就是我们所说的目标文件,同样用vim打开这个文件,会发现全是乱码,因为我们的文件已经转换为二进制文件了。-c是汇编选项。

  4、链接

  在转换为目标文件后我们的编译过程就只需要最后一步了。在C语言程序中我们往往会写很多个C语言文件,最后一步则就是将我们所写的多个文件进行整合汇总的过程。

  gcc 文件名.o -o 结果可执行文件名

  在链接指令中我们无需其他选项,执行完成后即可发现我们的目录中多出了可执行文件,到此编译全部结束。

gdb

  在Linux上的调试器上手有一定的门槛,因为gdb是作为控制台的编译器的是没有图形界面的,这就对我们的操作和调试带来了一定的难度。

基本指令

  最好在编译时加上-g选项生成Debug版本,否则会导致gdb部分指令无法使用。

  1、gdb 可执行文件进入gdb调试。

  2、break + 行号/函数名打断点。

  3、info break查看断点信息。

  4、delte + 断点编号删除断点。

  5、run让程序从头开始运行,遇到断点停止。

  6、continue让程序继续运行。当程序遇到断点停止想要继续运行时使用continue,使用run会让程序重新开始运行。

  7、print 变量名查看当前状态下变量信息。

  8、list查看当前执行到的语句附近的语句。

  9、bt查看调用栈。

  10、next单步执行下一条语句。

  11、quit退出gdb调试器。

核心转储文件

  当我们在ide中对于内存操作不当读取了不合法的内存后我们的程序会强制终止,并且ide会报错,那么我们在Linux中如果执行了类似于读取了非法的内存之类的内存使用不当的错误后会发生什么呢?

  我们可以尝试写一个文件专门用来读取一个非法的内存,来看看会发生什么。

  将我们写好的错误代码编译之后执行。会发现出现了段错误(吐核)的错误信息。对,这就是Linux下内存出错的表现。段错误是Linux内存出错的错误代称,我们暂时先不研究,那么后面的吐核是什么意思呢?所谓吐核就是生成一个错误报告告诉我们哪出错了,更像是车祸现场。但是我们查看这个目录下也没有新的文件生成啊,那么核吐到哪了呢?

  其实核普遍很大,因此不是想吐就能吐的除了来的,那么我们想要这个核能够吐出来该怎么做呢?

  执行指令ulimit -a,然后再执行ulimit -c unlimited指令,之后再去运行我们有错的代码生成的可执行文件即可看到我们当前目录下多出了一个core文件,这个就是所谓的核,那么我们怎么查看这个核的信息呢?我们的每个核都对应一个可执行文件,因此为了查看到正确的信息我们需要将可执行文件与核配对才能查看因此执行以下命令即可用gdb查看核了。gdb 可执行文件 core文件名。这个核也被称为核心转储文件。用gdb打开后即可发现gdb已经将报错的具体信息核代码的行数都列出来了。

  其实在实际编程中我们有很多情况下无法使用gdb进行调试,比如说遇到几率性bug,因此我们要学会用诸如输出的方式来进行调试,归根到底gdb不过是一个辅助我们调试的工具罢了,千万不要依赖于此调试工具,gdb往往更擅长于解决程序崩溃的问题。

makefile

  makefile工具与前两者有很大区别之处就在于其需要哦我们完全自定义指令所执行的内容,也就是说在使用makefile前我们需要首先自行编写一个Makefile文件。

Makefile配置

  首先我们用vim创建一个Makefile文件。vim Makefile

  Makefile的配置每一条语句都基本有三个模块组成。

  [目标]:[依赖](可无)

    [操作]

  我们首先在Makefile文件中输入以下操作来讲我们编写好的.c文件编译出来。

1
2
目标文件:.c文件
gcc -g .c文件 -o 目标文件

  随后保存退出vim,在控制台中执行make 目标文件命令,即可发现我们我们自动执行了编译语句,.c文件已经被自动编译并生成了目标文件。

  关于makefile的用法有很多十分多样,其中主要体现在Makefile配置的编写,不过一般情况下我们不会经常去编写Makefile文件,一般都是借助工具进行编写。关于Makefile的其他语法还需进一步学习。

-------------本文结束感谢您的阅读!-------------
记录学习每一分,感谢您的赞助