前言
学习了
vim
编辑器,我们能够在Linux
下写代码,那我们如何让代码运行起来呢?
现在就来学习使用gcc
gcc
/g++
编译器
现在有这样的一个test.c
文件
我们使用gcc
对它进行编译,形成可执行程序(默认形成a.out
)
编译-链接
隐约记得,在
C语言
学习中,简单的学习过编译和链接,当时也使用了gcc
形成中间临时文件;现在再来看一下,文件编译链接的过程
这里简化一下:
这里再简单描述一下,描述一下gcc
选项及其功能。
1. 预处理
预处理主包括宏定义、文件包含、语法编译、去注释等。
预处理指令以#
开头
gcc -E code.c -o code.i
-E
:让gcc
编译器在预处理结束后就停止
-o
:指模板文件,.i
文件是已经预处理过的C原始程序
2. 编译
编译阶段,gcc
要检查代码规范性、是否存在语法错误,并且确定代码实际的操作;检查无误后将代码翻译成汇编语言。
gcc -S code.i -o code.s
-S
:只进行编译而不进行汇编,生成汇编代码。
3. 汇编
汇编就是将编译生成的汇编代码.s
文件,转化为目标文件。
gcc -c code.s -o code.o
在此时生成的
-o
文件就是一个二进制目标文件了;但是不是可执行程序,还需要进行链接
4. 链接
gcc code.c -o code
在链接时,可以动态链接,也可以静态链接(gcc
默认是动态链接)静态链接需要带选项-static
动态链接:
ldd 可执行程序(动态链接)
用来查看程序所依赖的动态链接库信息
file 文件
可以用来查看文件类型
静态链接:
gcc
默认动态链接,静态链接需要带上-static
选项静态链接就是将库内容拷贝到文件中。(这里不演示了)
链接完成以后就形成了真正可以执行的可执行程序。
链接,这里就涉及到动静态库
这个概念。
动静态库
静态库
所谓静态库,就是在编译链接时,将库文件的所有内容拷贝到可执行程序中,生成的文件都比较大,在运行时不需要库文件了;
.a
是其后缀名。
动态库
动态库就并没有在编译链接时将库文件拷贝到可执行程序中;而是在程序运行时由运行时链接文件加载到库,这样就节省系统的开销。
一般后缀名是
.so
。在上文
ldd
查看动态链接库中lib.so.6
就是动态库
gcc
默认使用动态库。
gcc
选项
-E
:只进行预处理,不生成文件,需要重定向到一个文件中。(-o
)-S
:编译到汇编语言,不进行汇编和链接操作-c
:编译到目标代码,不进行链接操作-o
:输出到目标文件-static
:对生成文件采用静态链接-g
:生成调试信息,GNU
调试器可以利用此信息-shared
:尽量使用动态库,生成文件较小,需要系统存在动态库O0
、O1
、O2
、O3
:编译器优化的三个选项,-O0
没有优化、O1
是缺省值、O3
优化级别最高。-w
:不生成任何警告信息-Wall
:生成所有警告信息
到这里,gcc就结束了;有部分细节内容可以深入学习。
我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=2oul0hvapjsws