Linux编译器

目录

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输入函数,实质上我们做的就是对这个scanf函数的调用,但scanf函数的实现是在C语言库中的,我们要完成scanf函数的调用就得先在C语言库中找scanf函数的实现。那么在库中找函数实现的过程就叫做链接,链接也分为静态链接和动态链接。简单来说,链接就是将我们的代码和库中的代码联系起来,最终生成可执行程序。

什么是静态链接?什么是动态链接?

如果我们把库中的代码拷贝进入了我们自己的代码中,通过联系最终生成可执行程序,那么就是静态链接,如果我们写的代码和库中的代码是分开的,通过联系最终生成可执行程序,那就是动态链接。静态链接和动态链接都有自己的优点,同样也都有自己的缺点,静态链接的优点是不用频繁的去库中调用函数,节省了效率,但是由于将库中的函数全部拷贝到了可执行程序中,就会导致可执行序占用的内存过大,是一种以空间换时间的做法。动态链接的优点就是占用的内存小,缺点是一旦库丢失,那么整个源文件的编译过程就会崩溃。

静态链接和动态链接对应的就是静态库和动态库。把库中的代码拷贝(这里说剪切更合适)到自己的代码中,此时的库就是静态库(后缀名为.a),库中的代码和自己写的代码如果是分开的,那么此时就是库就是动态库(后缀名为.so)。

要实现链接阶段的工作我们需要实现下述代码:

Linux编译器_第1张图片

通过file mytest代码我们可以发现,gcc编译器在进行链接时,默认使用的是动态库,但是如果我们想要使用静态库,该怎样进行呢?我们可以使用下述代码实现:

Linux编译器_第2张图片

使用时可能会有/usr/bin/ld: cannot find -lc的报错,这里是因为没有安装静态库。

使用yum -y install glibc-static即可安装静态库。

以上便是使用gcc编译器完成C语言程序编译的整个过程,g++编译器完成对C++程序的编译也是同理的。

本期内容到此结束^_^
 

你可能感兴趣的:(Linux系统编程,知识总结,linux)