1.快速查看
在我们使用Linux的过程中,编译代码也是一项非常重要的功能。一般情况下,我们会使用gcc 和 g++ 来完成代码的编译。我们先来快速查看一下。
我们先创建一个code.cc文件,编译好自己的代码,然后用g++编译一下,就会形成a.out文件,这就是我们的可执行文件。然后./a.out编译文件,就编译成功了。
细节问题
- .cpp 和 .cc 和.cxx是c++文件的结尾
- gcc只能用来编译c语言,而g++都可以。
- Linux系统中后缀没有意义,但是编译器编译的时候还是会根据文件的类型来决定编不编译的。
2.背景知识
我们的计算机语言是经历了一个发展的过程的,从刚开始的二进制打孔,然后产生了汇编语言,再产生c语言。语言和编译器存在一个自举的过程。
3.程序的翻译工作
程序的翻译过程分为:预处理,编译,汇编,链接4大部分。
预处理
- 预处理过程中,首先会对代码中的头文件进行展开,就是把头文件中的内容拷贝到代码中
- 预处理会帮我们把注释全部清除
- 代码中的宏都会被替换成相应的代码
- 预处理会完成代码中的条件编译。
实例:
gcc -E hello.c -o hello.i
选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。
选项“-o”是指目标文件,“.i”文件为已经过预处理的C原始程序
编译
- 在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc 把代码翻译成汇编语言。
- 用户可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。
实例:
gcc –S hello.i –o hello
汇编(生成机器可识别代码)
- 汇编阶段是把编译阶段生成的“.s”文件转成目标文件
- 读者在此可使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了
实例:
gcc –c hello.s –o hello.o
链接
- 汇编阶段是把编译阶段生成的“.s”文件转成目标文件
- 读者在此可使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了
实例:
gcc –c hello.s –o hello.o
上面的内容我们知道就可以了,平时我们只需要直接用gcc 和 g++ 编译就行了。
还要记住文件的后缀是ESc 和 iso
4.动静态库
我们所写的代码都是站在巨人的肩膀上,已经有人跟我们写好了对应的可以直接使用的函数了,这些函数在哪里呢?就在我们的库中。
程序进行汇编形成 .o 文件后要跟库进行链接,才能形成可执行文件。
通过ldd指令,就可以看到我们的文件链接的库是哪个了。
动态库以 .so 结尾。静态库以 .a 结尾。 库都是以lib开头的
libc.so.6库去掉前后缀,就是它真正的名字了就是 c 库。
所以我们的开发环境安装就是:下载拷贝头文件和库文件到开发环境的特定路径下,一定要能被编译器找到。
动态库
动态库就相当于网吧,当你去上网的时候就是链接的过程。并且很多人都可以去上网,所以动态库也叫做共享库。动态库一旦缺失,会影响动态库的所有程序。
静态库
静态库就相当于你在自己家里安装了一台电脑,想玩电脑直接翻个身就可以了。所以静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了
动静态库的优缺点
动态链接是我们程序的默认链接方式,它比较节省资源