02.GCC编译器的使用
一、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编译器的使用相关推荐
- mtl库在GCC编译器下的使用
最近一直在改造算法库,将其移植到Linux平台下.使用GCC编译器是发现MTL库中出现一大堆的问题.使用的MTL库下载地址为:http://osl.iu.edu/research/mtl/downlo ...
- Proteus8.9 VSM Studio GCC编译器仿真STM32F407ZGT6系列011_lcd1602_并口
一,打开文件(可以随文下载放置在文档中打开).(如下图1所示) 图1 二,调整原理图大小,适合可视,另存工程文件.(如下图2,3,4所示) 图2 图3 图4 三,点击Source Code标签.(如下 ...
- GCC背景强大? 探寻linux系统下GCC编译器的背后故事!
这里写自定义目录标题 一.在vim和gcc编译环境下生成.a静态库和.so动态库 汇编部分 关于链接 分析ELF文件 反汇编ELF 二.gcc生成静态库和动态库 调用静态库 动态库与静态库的比较 静态 ...
- GCC编译器的常用命令及使用
一.用gcc生成静态库和动态库 (1)编辑生成子程序hello.h.hello.c.main.c (2)将hello.c编译成.o文件 (3)由.o文件创建静态库 (4)在程序中使用静态库 (5)由. ...
- PTA 7-28 猴子选大王 (20 分)-gcc编译器过不了?
综述: 猴子选大王这道题看着好像挺简单的,但是实际做起来也不容易.猴子的编号从1到N,然后报数,首先面对的第一个问题是怎么存储这些个猴子,我最开始想用链表,因为链表删除数据容易点,而数组要是删除中间的 ...
- Keil5.15使用GCC编译器链接.a库文件
我们知道,当使用第三方的代码时,人家有可能会扔个Lib文件给你.这时候,别人仅仅要提供header文件给你,则你就能够通过Lib文件及header的函数声明,对Lib中的函数进行调用.在Keil中假设 ...
- 转 vi 编辑器,gcc 编译器的使用
vi编辑器是我们在linux下经常使用的文本编辑器,这个东西也是专门为程序员准备的,基本上每个Unix和Linux系统都为我们提供了这个软件,我们可以使用vi来编写我们的代码.在vi编辑器下所有操作都 ...
- linux make链接.o文件,Linux操作系统至gcc编译器、makefile
gcc编译器: 将高级语言代码编译成为机器可识别的指令代码 编译文件 编译步骤: 1.预处理,展开所有代码 gcc-E只预处理 -o 指定修改后的文件名称 2.编译:纠错,没有错误则将c语言代码 ...
- vs编译器 printf 控制台输出_【语言教程】通过语言了解GCC编译器工作过程
通过c语言了解GCC编译器如何工作的 比特 下面是c语言初学必看的打印helloworld #include int main(){ printf("hello, world\n" ...
最新文章
- Oracle 用数据泵导入导出数据
- Metasploit Shell升级Meterpreter会话技巧
- dede问答模块 那个php文件相对重要,DEDE5.7 问答模板的修改技巧
- 数据结构——二叉树的双序遍历
- PHP获取服务器端的相关信息
- 如何读H.264的标准和代码
- 深度学习多模态融合_3D目标检测多模态融合综述
- 互联网晚报 | 1月26日 星期三 | 春晚正式入驻视频号;小红书合并社区与电商业务;中国电信5G消息正式商用...
- latex中括号大小控制 [转]
- 蔚来与雷蛇联合推出NIO ES6限量版车型 售价46.78万元
- windows优化大师怎么用_软件不能用又卸载不掉怎么办——用Windows自家的卸载工具吧(dos级卸载)...
- Linux cannot remove 'XXX': Is a directory 解决办法
- powerful number求积性函数前缀和
- 惠普打印机介质不匹配_HP打印机驱动安装失败的解决办法
- CDlinux wifi密码破解(pin码枚举)
- 未来几年,自动化发展趋势展望
- PHP - 使用file_get_contents下载远程文件到本地
- 【PC工具】可能是最好用的下载工具:IDM特点及功能汇总,IDM破解版下载,PC好用的迅雷下载版本合集...
- SSM实现邮箱验证功能
- openjudge 1.3.10 计算并联电阻的阻值
热门文章
- STEM 是个怎样高大上的东西?
- 听说写面经能赞RP·······
- 微信小程序参数传递获取当前页面的url和参数
- python count函数时间复杂度_关于python:了解如何测量函数的时间复杂度
- python matplotlib searbon 设置画版颜色 热力图固定颜色等级 固定比例尺寸大小
- 一些关于CV和deeplearning的干货链接(长期更新)
- 计算机dns怎么设置方法,电脑的dns怎么设置具体方法
- 共线性诊断 matlab,求共线性诊断结果的含义
- php框架 猪婆,猪婆塘_三湖文学社_新高淳论坛 - Powered by Discuz!
- Epson针式打印机打印十六进制内容解决方案