GCC编译之过程详解

本文详细介绍了GCC编译过程,包括编译的概念、预处理、编译与优化、汇编和链接五个阶段。通过实例展示了从C源代码到可执行程序的每一步变化,讲解了各种编译选项的作用,如-E、-s、-c和-o等,并阐述了静态链接与动态链接的区别。
摘要由CSDN通过智能技术生成

1.编译过程
1.1编译的概念

编译程序读取源程序(字符流),对之进行语法和词法分析,将高级语言指令转换为功能等效的汇编代码,再由汇编程序转换为机器语言,并且按照操作系统对可执行文件格式的要求链接生成可执行程序。

编译的完整过程:C源程序—>预编译处理(.c)—>编译、优化程序(.s、.asm)—>编译生成汇编程序(.obj、.o、.a、.ko)—>链接生成可执行程序(.exe、.elf、.axf)

1.2 常用选项
  • -E:只进行预处理、不编译
  • -s:只编译、不汇编
  • -c:只编译、汇编、不链接
  • -o:链接输出指定文件名
  • -l:指定所需链接的库名
  • -L:指定链接所需库(动态库或静态库)的路径
  • -ansi:指定ANSI标准
  • -std=c99:指定c99标准
  • -Werror:不分警告和错误,遇到任何警告都停止编译
  • -Wall:开启大部分警告提示
2.预处理

gcc命令:ten@Public_RPi:~/wangruijie$ gcc -E hello.c -o hello.i

预处理是读取c源程序,对其中的伪指令(以#开头的指令,也就是宏)和特殊符号进行“替代”处理, 经过此处理生成一个没有宏定义,没有条件编译指令,没有特殊符号的输出文件,这个文件的含义同没有经过预处理的源文件是相同的,仍然是c文件,但内容有所不同,伪指令主要包括以下三个方面:

  1. 宏定义指令,如#define, #undef以及编译器内建的一些宏, 如__DATE__, FILE
  2. 条件编译指令,如#ifdef, #ifndef, #else, #elif, #endif等。
  3. 头文件包含的指令:如#include<>/"".
2.1代码示例

给出没有经过预处理的代码

  1 #include<stdio.h>
  2 
  3 int main(int argc, char **argv)
  4
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值