目录
Linux编译器
程序编译的步骤
gcc编译器完成C语言程序的编译
预处理
编译
汇编
链接
上一期我们学习了Linux中的vim编辑器,其实本质上vim编辑器就是写代码的一个工具。上期内容我们也已经说过,一份合格的代码需要进行编写,编译,调试,运行,运行,发布这几个步骤,上期我们讲述了编写的步骤,本期将为大家讲解编译步骤。
Linux编译器
程序编译的步骤
一个程序要被编译,一般要进行以下几个步骤:预处理,编译,汇编,链接。在linux中,完成C语言程序的编译我们使用gcc编译器进行编译,完成C++程序的编译我们需要使用g++编译器进行编译。
gcc编译器完成C语言程序的编译
预处理
我们先创建一个C语言的源文件test.c,然后对此文件进行各种操作。
在预处理阶段,我们要完成的工作就是要完成头文件的展开,宏替换和去注释。对test.c完成这些操作之后,我们会生成对应的test.i文件,完成这些工作我们需要下述代码:
执行完上述代码之后会生成对应的test.i文件。
编译
为什么要进行编译?
因为对于编译器而言,它只能识别机器码,所以必须通过编译阶段先将高级的语言程序代码先转为汇编代码,然后再将汇编代码转为编译器可以识别的机器代码即0和1。需要注意的是这个编译和整个源程序的编译不是一个编译,这里的编译是整个源程序编译的一个步骤。
在编译阶段,主要的任务就是将C语言代码全部转为汇编代码。要完成这些工作,需要执行下述代码:
这里需要注意的是对预处理之后的test.i文件进行操作。最终生成了test.s文件。
汇编
在汇编阶段,主要的任务就是把汇编代码全部转成二进制机器码,供编译器进行处理。要完成这些工作,需要执行下述代码:
这里需要注意的是是对编译阶段之后的test.s文件进行操作。 最终生成了test.o文件。
链接
什么是链接?为什么需要链接?
举个栗子,我们在C语言中学习了了scanf输入函数,实质上这个函数在进行实现时,我们是调用了C语言库中的函数进行实现,且库中的scanf的实现过程是很复杂的。那么调用库中的函数的过程就叫做链接,链接也分为静态链接和动态链接。简单来说,链接就是将我们的代码和库中的代码联系起来,最终生成可执行程序。
什么是静态链接?什么是动态链接?
如果我们把库中的代码拷贝进入了我们自己的代码中,通过联系最终生成可执行程序,那么就是静态链接,如果我们写的代码和库中的代码是分开的,通过联系最终生成可执行程序,那就是动态链接。静态链接和动态链接都有自己的优点,同样也都有自己的缺点,静态链接的优点是不用频繁的去库中调用函数,节省了效率,但是由于将库中的函数全部拷贝到了可执行程序中,就会导致可执行序占用的内存过大,是一种以空间换时间的做法。动态链接的优点就是占用的内存小,缺点是一旦库丢失,那么整个源文件的编译过程就会崩溃。
静态链接和动态链接对应的就是静态库和动态库。把库中的代码拷贝(这里说剪切更合适)到自己的代码中,此时的库就是静态库(后缀名为.a),库中的代码和自己写的代码如果是分开的,那么此时就是库就是动态库(后缀名为.so)。
要实现链接阶段的工作我们需要实现下述代码:
通过file mytest代码我们可以发现,gcc编译器在进行链接时,默认使用的是动态库,但是如果我们想要使用静态库,该怎样进行呢?我们可以使用下述代码实现:
使用时可能会有/usr/bin/ld: cannot find -lc的报错,这里是因为没有安装静态库。
使用yum -y install glibc-static即可安装静态库。
以上便是使用gcc编译器完成C语言程序编译的整个过程,g++编译器完成对C++程序的编译也是同理的。
本期内容到此结束^_^