1. gcc编译器的安装
工作中,在Linux环境下,有过量产项目的公司,gcc一般都是已经安装好了的。如果需要安装,请从官网下载或网上找资源下载
gcc官网:https://gcc.gnu.org/
此处不赘述安装过程了
查看是否安装成功:gcc -v 能查到gcc版本号,说明安装成功
2. 编译过程介绍:
最开始学习编程的时候,一般都是用IDE去编译的,不管是IDE还是gcc编译的时候都会有四个过程
一个编译过程一般要经过四个过程:
预处理——编译——汇编——链接
预处理:展开头文件/宏替换/去掉注释/条件编译
编译:检查语法,生成汇编代码
汇编:汇编代码转换机器码,但还不可执行
链接:将要用到的库链接到一起生成可执行程序
gcc首先调用cpp进行预处理,在预处理过程中,对源代码文件中的文件包含(include)、预编译语句(如宏定义define等)进行分析。接着调用cc1进行编译,这个阶段将预处理得到的源代码文件,进行“翻译转换”,产生出机器语言的目标程序,得到机器语言的汇编文件。汇编过程是针对汇编语言的步骤,调用as进行工作,一般来讲,.S为后缀的汇编语言源代码文件和汇编、.s为后缀的汇编语言文件经过预编译和汇编之后都生成以.o为后缀的目标文件。当所有的目标文件都生成之后,gcc就调用ld来完成最后的关键性工作,这个阶段就是链接。在链接阶段,所有的目标文件被安排在可执行程序中的恰当的位置,同时,该程序所调用到的库函数也从各自所在的库中链到合适的地方。
3. gcc的使用:
3.1 简单使用
命令格式:gcc [选项] [文件名]
以编译单个文件为例,最简单的使用方法:
gcc test.c //默认生成可执行文件的名字为a.out
指定可执行文件的名字:gcc –o test test.c //指定生成可执行文件的名字为test
3.2 gcc编译经历的四个过程:
(1)预处理: gcc -E test.c -o test.i//生成预编译文件
(2)编译: gcc -S test.i -o test.s//生成汇编代码
(3)汇编: gcc -c test.s -o test.o (或as test.s -o test.o ) //生成目标文件
(4)链接: gcc -o test test.o//链接,生成可执行文件
3.3 gcc常用选项
选项 | 含义 |
---|---|
-E | 只预编译,不做任何处理 |
-c | 只编译不链接,生成目标文件”.o” |
-S | 只编译不会汇编,生成汇编代码”.s” |
-g | 在执行过程中包含标准调试信息 |
-o file | 指定将file文件作为输出文件 |
-v | 打印出编译器内部编译各过程的命令行信息和编译器的版本 |
-I dir | 在头文件的搜索路径列表中添加dir目录 |
3.4 gcc支持的后缀名
后缀名 | 所对应的语言 |
---|---|
.c | C原始程序 |
.C/.cc/.cxx | C++原始程序 |
.m | Objective.c原始程序 |
.i | 已经预处理的C原始程序 |
.ii | 已经预处理的C++原始程序 |
.s/.S | 汇编语言原始程序 |
.h | 预处理文件(头文件) |
.o | 目标文件 |
4. 静态库和动态库
链接可分为动态链接和静态链接:
静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为 “.a”。
动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为“.so”。
gcc在编译时默认使用动态库链接,加上-static 参数则采用静态链接。
gcc test.o -static -o test_static
可看出链接静态库和动态库,最终生成的可执行文件大小相差很多
动态库链接,加上-static 参数则采用静态链接。
gcc test.o -static -o test_static
可看出链接静态库和动态库,最终生成的可执行文件大小相差很多
今天的文章gcc编译过程分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/6960.html