ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C语言程序编译过程

2022-03-31 10:34:40  阅读:106  来源: 互联网

标签:文件 gcc 汇编 程序 hello 编译 C语言 链接


C程序源代码-->预处理-->编译-->汇编-->链接-->可执行程序

  • 预处理(Pre-Processing)
    1)将所有的#define删除,并且展开所有的宏定义
    2)处理所有的条件预编译指令,比如#if #ifdef #elif #else #endif等
    3)处理#include 预编译指令,将被包含的文件插入到该预编译指令的位置。
    4)删除所有注释 "//"和"/* */".
    5)添加行号和文件标识,以便编译时产生调试用的行号及编译错误警告行号。
    6)保留所有的#pragma编译器指令,因为编译器需要使用它们

  • 编译 (Compiling)
    编译过程就是把预处理完的文件进行一系列的词法分析,语法分析,语义分析及优化后,最后生成相应的汇编代码

  • 汇编 (Assembling)
    汇编器是将汇编代码转变成机器可以执行的命令,每一个汇编语句几乎都对应一条机器指令。汇编相对于编译过程比较简单,根据汇编指令和机器指令的对照表一一翻译即可

  • 链接 (Linking)
    通过调用链接器ld来链接程序运行需要的一大堆目标文件,以及所依赖的其它库文件,最后生成可执行文件

范例:gcc编译过程

#分步骤编译运行
gcc -E hello.c -o hello.i 对hello.c文件进行预处理,生成了hello.i 文件
gcc -S hello.i -o hello.s 对预处理文件进行编译,生成了汇编文件
gcc -c hello.s -o hello.o 对汇编文件进行编译,生成了目标文件
gcc hello.o -o hello 对目标文件进行链接,生成可执行文件

#一步实现编译过程
gcc hello.c -o hello
直接编译链接成可执行目标文件

静态链接和动态链接

静态链接

  • 把程序对应的依赖库复制到软件包
  • 生成模块文件libxxx.a
  • 嵌入程序包
  • 升级难,需重新编译
  • 占用较多空间,但易于迁移

动态编译

  • 把依赖关系使用链接处理
  • 生成模块文件libxxx.so
  • 连接指向
  • 占用较少空间,升级方便

标签:文件,gcc,汇编,程序,hello,编译,C语言,链接
来源: https://www.cnblogs.com/peen/p/16080526.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有