GCC编译器与编译过程

1.GCC简介

1.1概念

1.GNU
GNU 项目创始于一九八四年,旨在开发一个类似 Unix ,且为自由软件的完整的操作系统: GNU 系统。GNU 的内核尚未完成,所以 GNU 使用 Linux 作为其内核。GNU 和 Linux 以这样的方式组合成为 GNU/Linux 操作系统,这个组合有时被错误地称为 Linux。详见:GNU
2.GCC
GCC(GNU Compiler Collection,GNU编译器套件)是由GNU开发的编程语言译器。初衷是为GNU操作系统专门编写的一款编译器。GCC开始时只能编译C语言,后来扩展到可以编译C++、java等。
3.gcc与g++
gcc是GCC中的GUN C Compiler(C 编译器),g++是GCC中的GUN C++ Compiler(C++编译器),就本质而言,gcc和g++并不是编译器,也不是编译器的集合,它们只是一种驱动器,根据参数中要编译的文件的类型,调用对应的GUN编译器而已,因此,更准确的说法是:gcc调用了C compiler,而g++调用了C++ compiler。

1.2 gcc与g++详解

1.2.1 .主要区别

参考:Stack Overflow
在这里插入图片描述
也就是说,g++会自动链接标准库STL,而gcc不会,但在某些情况下,gcc加上一些参数后也可以编译c++程序,例如:
在这里插入图片描述

1.2.2 后缀名相关

1.回顾后缀名
1)在windows中,后缀名有特定的含义,根据文件的后缀就能判断文件的类型,文件的类型是和相应的程序关联的。当我们打开某个文件时,系统会自动判断用哪个应用打开。
2)在linux中,文件后缀名没有太大的意义,主要看文件的属性有关,文件后缀一般是方便自己看的;
2)对于编译器而言,无论是linux还是windows,对于文件名都有一致的规定。
2.g++支持的后缀名
参考:官方文档
g++对文件后缀有如下要求:

C++ source files:‘.C’,.cc’,.cpp’,.CPP’,.c++,.cp’,.cxx’
C++ header files:‘.hh’,.hpp’,.H’,.tcc’(for shared template code)
此外:
It treats ‘.c’,.h’ and.i’ files as C++ source files instead of C 
source files unless -x is used.

也就是说,我们只能使用上述文件后缀,不能使用违规的后缀,否则无法通过编译,如:
在这里插入图片描述
然而,可以通过-x参数使编译器直接获取语言类型,无需理会后缀名
在这里插入图片描述

1.2.3 GCC参数

更多参数用法
乱码问题:https://www.cnblogs.com/dan-jacky/p/6565986.html

2 编译过程

详见:参考1参考2
分为四个部分:预编译、编译、汇编和链接
在这里插入图片描述

2.1 预编译

代码:gcc -E hello.c -o hello.i
主要作用:
【1】删除#define,展开所有宏定义。例#define portnumber 3333
【2】处理条件预编译 #if, #ifdef, #if, #elif,#endif
【3】处理“#include”预编译指令,将包含的“.h”文件插入对应位置。这可是递归进行的,    文件内可能包含其他“.h”文件。
【4】删除所有注释。/**/,//。
【5】添加行号和文件标识符。用于显示调试信息:错误或警告的位置。
【6】保留#pragma编译器指令。(1)设定编译器状态,(2)指示编译器完成一些特定的动作。

2.2 编译

代码:gcc -s hello.c -o hello.s
主要作用:
【1】扫描(词法分析)
【2】语法分析
【3】语义分析
【4】源代码优化(中间语言生成)
【5】代码生成,目标代码优化。

2.3汇编

代码:gcc -c hello.c -o hello.o
主要作用:
汇编器是将汇编代码转变成可以执行的指令,生成目标文件。

2.4链接

代码:gcc hello.o -o hello
主要作用:将各个模块之间相互引用的部分正确的衔接起来。它的工作就是把一些指令对其他符号地址的引用加以修正,链接过程主要包括了地址和空间分配、符号决议和重定向。
【1】地址和空间分配
【2】符号决议:有时候也被叫做符号绑定、名称绑定、名称决议、或者地址绑定,其实
   就是指用符号来去标识一个地址。比如说 int a = 6;这样一句代码,用a来标识一个块
   4个字节大小的空间,空间里边存放的内容就是4.
【3】重新计算各个目标的地址过程叫做重定位。
最基本的链接叫做静态链接,就是将每个模块的源代码文件编译成目标文件(Linux:.o Windows:.obj),然后将目标文件和库链接形成最后的可执行文件。

  • 5
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值