C/C++编译过程

预处理阶段:
预处理(preprocessing)指令:

gcc -E hello.c -o hello.i


将.c文件翻译成.i文件,预处理器指令以#号开头,预处理器执行宏替换(比如 #define)、条件编译(比如#if、#elif、#else、#endif、#ifdef、#ifndef)以及包含指定的文件(比如#include)。
编译阶段:
编译(compilation)指令:

gcc -S hello.c/hello.i -o hello.s


将.i文件翻译成.s文件,即汇编语言程序。

g++ -S指令并非必须经过预处理后的.i文件,-S选项的功能是令GCC编译器将指定文件预处理至编译阶段结束。

也就是说g++ -S可以处理.i文件,也可以处理原代码文件。

汇编阶段:
汇编(assembly)指令:

gcc -c hello.s -o hello.o


将.s文件翻译成.o文件,汇编器将.s文件翻译成机器语言指令,即.o文件,hello.o 文件:可重定位目标文件(机器码文件),是二进制文件,由汇编文件经过汇编操作生成,该文件不可直接执行。
链接阶段:
链接(assembly)指令:

gcc -o hello.o -o hello(.out)//后面的.out一般省略不写


hello(.out) 文件:二进制可执行目标文件(也是一个目标文件),由机器码文件进一步链接生成。这一步中,各种符号引用和符号定义转换成为可执行文件中的合适信息,通常是虚拟地址。
文本程序里的各种函数都存在有自身的.o的单独预编译好的目标文件,连接器就是将这些函数自身的.o文件合并在整个.o文本程序中。

静态库、动态库区别来自【链接阶段】如何处理库,链接成可执行程序。分别称为静态链接方式、动态链接方式。

以上4个步骤也可直接一步生成:

gcc hello.c -o hello//一气呵成指令

以上各个阶段的指令都是gcc编译的,想使用C++编译的话将各个阶段的指令中的gcc改为g++,然后将hello.c文件改为hello.cpp即可。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值