GCC的编译过程和链接
2024-09-06 02:52:21
GCC编译过程
- 一个C/C++文件要经过预处理(preprocessing)、编译(compilation)、汇编(assembly)、和连接(linking)才能变成可执行文件。
gcc的常用选项
-E 只预处理,不会编译、汇编、链接
-S 编译到汇编语言不进行汇编和链接
-c 编译和汇编,不会链接
-o 指定输出文件名为file,这个名称不能跟源文件名同名
-static 此选项对生成的文件采用静态链接
-g 生成调试信息,GNU调试器可利用该信息。
-share 此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库.
-O0
-O1
-O2
-O3 编译器的优化选项的4个级别,-O0表示没有优化-O1为缺省值,-O3优化级别最高
-w 不生成任何警告信息。
-Wall 生成所有警告信息.
以hello.c为例:
#include <stdio.h>
#define MAX 20
#define MIN 10
#define _DEBUG
#define SetBit(x) (1<<x) int main(int argc, char* argv[])
{
printf("Hello World \n");
printf("MAX = %d,MIN = %d,MAX + MIN = %d\n",MAX,MIN,MAX + MIN);
#ifdef _DEBUG
printf("SetBit(5) = %d,SetBit(6) = %d\n",SetBit(),SetBit());
printf("SetBit( SetBit(2) ) = %d\n",SetBit( SetBit() ));
#endif
return ;
}
预处理
- 预处理就是将要包含(include)的文件插入原文件中、将宏定义展开、根据条件编译命令选择要使用的代码,最后将这些代码输出到一个“.i”文件中等待进一步处理。
命令为:
gcc -E -o hello.i hello.c
编译
- 编译就是把C/C++代码(比如上面的".i"文件)“翻译”成汇编代码。
命令是:
gcc -S -o hello.s hello.i
汇编
- 汇编就是将第二步输出的汇编代码翻译成符合一定格式的机器代码,在Linux系统上一般表现位ELF目标文件(OBJ文件)。
命令是:
gcc -c -o hello.o hello.s
链接
- 链接就是将汇编生成的OBJ文件、系统库的OBJ文件、库文件链接起来,最终生成可以在特定平台运行的可执行程序。
命令是:
gcc -o hello hello.o
总结:
在编译过程中。除非使用了"-c",“-S”,或"-E"选项(或者编译错误阻止了完整的过程),否则统一完整链接步骤。
譬如:gcc hello.c 和gcc -o hello hello.c都已经完成链接操作。
最新文章
- 【原】iphone6来了,我该做点什么(兼容iphone6的方法)
- [小菜随笔]新手使用appium+python进行自动化测试过程中webdriver.Remote报错的错误分析方法(带实例)
- Thinking in UML-2-建模基础
- 高级选择器querySelector和querySelectorAll
- 数据结构之,线性表去除等于x的元素
- c语言数据结构:01背包问题-------动态规划
- 2016-03-10:libx265源码解析
- Android 实现书籍翻页效果----升级篇
- VS2012 直接浏览网页时报错
- upgrade和update的区别
- Powershell创建对象
- Nginx+Tomcat+MemCached 集群配置手册
- JavaScript Cookie使用实例
- CMDB-(paramiko模块 -- 实现ssh连接)
- hanjiaqi
- 深度学习基础(CNN详解以及训练过程1)
- Robot Framework使用For循环
- Go Example--通道方向
- 百度谷歌雅虎三大搜索引擎比较和如何配置谷歌访问助手访问Google搜索服务
- Linux命令常用