一、GCC编译过程

一个C/C++文件要经过预处理(preprocessing)编译(compilation)汇编(assembly)链接(linking)等4步才能变成可执行文件。

gcc编译器可以通过指定不同的编译选项从而控制整个过程

(1)预处理

C/C++源文件中,以“#”开头的命令被称为预处理命令,如包含命令“#include”、宏定义命令“#define”、条件编译命令“#if”、“#ifdef”等。预处理就是将要包含(include)的文件插入原文件中、将宏定义展开、根据条件编译命令选择要使用的代码,最后将这些东西输出到一个“.i”文件中等待进一步处理。

(2)编译

编译就是把C/C++代码(比如上述的“.i”文件)“翻译”成汇编代码,所用到的工具为cc1(它的名字就是cc1,x86有自己的cc1命令,ARM板也有自己的cc1命令)。

(3)汇编

汇编就是将第二步输出的汇编代码翻译成符合一定格式的机器代码,在Linux系统上一般表现为ELF目标文件(OBJ文件),用到的工具为as。x86有自己的as命令,ARM版也有自己的as命令,也可能是xxxx-as(比如arm-linux-as)。

“反汇编”是指将机器代码转换为汇编代码,这在调试程序时常常用到。

(4)链接

链接就是将上步生成的OBJ文件和系统库的OBJ文件、库文件链接起来,最终生成了可以在特定平台运行的可执行文件,用到的工具为ld或collect2。

二、 单步执行整个编译过程

程序代码如下:

#include <stdio.h>#define MAX 20
#define MIN 10//#define _DEBUGint main(int argc,char *argv[])
{printf("Hello world\r\n");printf("MAX = %d,MIN = %d,MAX + MIN = %d\r\n",MAX,MIN,MAX + MIN);#ifdef _DEBUGprintf("Hello world\r\n");printf("MAX = %d,MIN = %d,MAX - MIN = %d\r\n",MAX,MIN,MAX - MIN);
#endifreturn 0;
}

预处理: 

gcc -E -o hello.i hello.c 

表示将hello.c文件进行预处理,所有信息都存放在hello.i中。

打开生成的hello.i,文件发现在预处理阶段已经将需要包含的头文件包含,宏定义进行了展开。现在将程序中的_DEBUG宏定义打开,发现条件编译的内容出现了。

编译:

gcc -S -o hello.s hello.i 

使用如上命令可以将预处理过后的内容进行编译生成.s文件,文件内容如下:

汇编:

gcc -c -o hello.o hello.s

使用如上命令将.s文件可以编程.o文件,即汇编过程。

链接:

gcc -o hello hello.o

最后一步不加任何参数,就可以将系统.o文件和你编写的.o文件链接成可执行的APP

三、 常用编译选项

常用选项

描述

-E

预处理,开发过程中想快速确定某个宏可以使用“-E  -dM”

-c

把预处理、编译、汇编都做了,但是不链接

-o

指定输出文件

-I

指定头文件目录

-L

指定链接时库文件目录

-l

指定链接哪一个库文件

通常先使用命令:

gcc -c -o main.o main.c命令把预处理、编译、汇编都完成,最后再自行使用gcc -o xxx.o进行链接。


注意:

gcc编译器在与处理的过程中不会检查你的错误,是在编译那一步检查错误的。

02.GCC编译器的使用相关推荐

  1. mtl库在GCC编译器下的使用

    最近一直在改造算法库,将其移植到Linux平台下.使用GCC编译器是发现MTL库中出现一大堆的问题.使用的MTL库下载地址为:http://osl.iu.edu/research/mtl/downlo ...

  2. Proteus8.9 VSM Studio GCC编译器仿真STM32F407ZGT6系列011_lcd1602_并口

    一,打开文件(可以随文下载放置在文档中打开).(如下图1所示) 图1 二,调整原理图大小,适合可视,另存工程文件.(如下图2,3,4所示) 图2 图3 图4 三,点击Source Code标签.(如下 ...

  3. GCC背景强大? 探寻linux系统下GCC编译器的背后故事!

    这里写自定义目录标题 一.在vim和gcc编译环境下生成.a静态库和.so动态库 汇编部分 关于链接 分析ELF文件 反汇编ELF 二.gcc生成静态库和动态库 调用静态库 动态库与静态库的比较 静态 ...

  4. GCC编译器的常用命令及使用

    一.用gcc生成静态库和动态库 (1)编辑生成子程序hello.h.hello.c.main.c (2)将hello.c编译成.o文件 (3)由.o文件创建静态库 (4)在程序中使用静态库 (5)由. ...

  5. PTA 7-28 猴子选大王 (20 分)-gcc编译器过不了?

    综述: 猴子选大王这道题看着好像挺简单的,但是实际做起来也不容易.猴子的编号从1到N,然后报数,首先面对的第一个问题是怎么存储这些个猴子,我最开始想用链表,因为链表删除数据容易点,而数组要是删除中间的 ...

  6. Keil5.15使用GCC编译器链接.a库文件

    我们知道,当使用第三方的代码时,人家有可能会扔个Lib文件给你.这时候,别人仅仅要提供header文件给你,则你就能够通过Lib文件及header的函数声明,对Lib中的函数进行调用.在Keil中假设 ...

  7. 转 vi 编辑器,gcc 编译器的使用

    vi编辑器是我们在linux下经常使用的文本编辑器,这个东西也是专门为程序员准备的,基本上每个Unix和Linux系统都为我们提供了这个软件,我们可以使用vi来编写我们的代码.在vi编辑器下所有操作都 ...

  8. linux make链接.o文件,Linux操作系统至gcc编译器、makefile

    gcc编译器: 将高级语言代码编译成为机器可识别的指令代码 编译文件 编译步骤: 1.预处理,展开所有代码  gcc-E只预处理   -o 指定修改后的文件名称 2.编译:纠错,没有错误则将c语言代码 ...

  9. vs编译器 printf 控制台输出_【语言教程】通过语言了解GCC编译器工作过程

    通过c语言了解GCC编译器如何工作的 比特 下面是c语言初学必看的打印helloworld #include int main(){ printf("hello, world\n" ...

最新文章

  1. Oracle 用数据泵导入导出数据
  2. Metasploit Shell升级Meterpreter会话技巧
  3. dede问答模块 那个php文件相对重要,DEDE5.7 问答模板的修改技巧
  4. 数据结构——二叉树的双序遍历
  5. PHP获取服务器端的相关信息
  6. 如何读H.264的标准和代码
  7. 深度学习多模态融合_3D目标检测多模态融合综述
  8. 互联网晚报 | 1月26日 星期三 | 春晚正式入驻视频号;小红书合并社区与电商业务;中国电信5G消息正式商用...
  9. latex中括号大小控制 [转]
  10. 蔚来与雷蛇联合推出NIO ES6限量版车型 售价46.78万元
  11. windows优化大师怎么用_软件不能用又卸载不掉怎么办——用Windows自家的卸载工具吧(dos级卸载)...
  12. Linux cannot remove 'XXX': Is a directory 解决办法
  13. powerful number求积性函数前缀和
  14. 惠普打印机介质不匹配_HP打印机驱动安装失败的解决办法
  15. CDlinux wifi密码破解(pin码枚举)
  16. 未来几年,自动化发展趋势展望
  17. PHP - 使用file_get_contents下载远程文件到本地
  18. 【PC工具】可能是最好用的下载工具:IDM特点及功能汇总,IDM破解版下载,PC好用的迅雷下载版本合集...
  19. SSM实现邮箱验证功能
  20. openjudge 1.3.10 计算并联电阻的阻值

热门文章

  1. STEM 是个怎样高大上的东西?
  2. 听说写面经能赞RP·······
  3. 微信小程序参数传递获取当前页面的url和参数
  4. python count函数时间复杂度_关于python:了解如何测量函数的时间复杂度
  5. python matplotlib searbon 设置画版颜色 热力图固定颜色等级 固定比例尺寸大小
  6. 一些关于CV和deeplearning的干货链接(长期更新)
  7. 计算机dns怎么设置方法,电脑的dns怎么设置具体方法
  8. 共线性诊断 matlab,求共线性诊断结果的含义
  9. php框架 猪婆,猪婆塘_三湖文学社_新高淳论坛 - Powered by Discuz!
  10. Epson针式打印机打印十六进制内容解决方案