当前位置: 首页 > news >正文

程序编译和链接

编译过程

hello.cpp 编译过程:预处理编译汇编链接

Prepressing
Prepressing
Compilation
Assembly
Linking
Linking
Source Code hello.cpp
Prepressed hello.i
Header Files stdio.h
Assembly hello.s
Object File hello.o
Executable File a.out
Static Library libc.a

预编译(Prepressing)

源代码文件 hello.cpp 和相关的头文件,如 stdio.h 等被预编译器 cpp 预编译成一个 .i 文件。

gcc –E hello.cpp –o hello.i

预编译过程主要处理预编译指令:

  • 删除 #define,并且展开所有的宏定义。
  • 处理条件预编译指令(#if, #ifdef, #elif, #else, #endif)。
  • 处理 #include 预编译指令。
  • 删除所有的注释。
  • 添加行号和文件名标识。
  • 保留所有的 #pragma 编译器指令。

可以查看预编译后的文件来判断宏定义是否正确或头文件是否正确包含。

编译(Compilation)

预处理完的文件进行一系列处理:扫描词法分析语法分析语义分析源代码优化汇编代码生成优化汇编代码

gcc –S hello.i –o hello.s

现在版本的 GCC 把预编译和编译两个步骤合并成一个步骤,使用一个叫 做 cc1 的程序来完成这两个步骤。

/usr/lib/gcc/i486-linux-gnu/4.1/cc1 hello.cpp

汇编(Assembly)

汇编代码转变成机器可以执行的指令。

gcc –c hello.cpp –o hello.o

程序 as 根据汇编指令和机器指令的对照表翻译。

as hello.s –o hello.o

链接(Linking)

程序 ld 产生一个能够正常运行 的 HelloWorld 程序:

ld -static -o HelloWorld /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/gcc/i486-linux-gnu/4.1.3/crtbeginT.o hello.o -L/usr/lib/gcc/i486-linux-gnu/4.1.3 -L/usr/lib -L/lib --start-group -lgcc -lgcc_eh -lc --end-group /usr/lib/gcc/i486-linux-gnu/4.1.3/crtend.o /usr/lib/crtn.o

参考文献

《程序员的自我修养》

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 032-GeoGebra中级篇-列表与集合(list and set)及常用操作大全
  • latex换行\left[和\right]编译报错-解决方案
  • JavaScript 打印 V 和倒 V 图案的程序(Program to print V and inverted-V pattern)
  • 【前端面试】七、算法-迭代器和生成器
  • 【Stable Diffusion】(基础篇九)—— 扩展
  • 黑客的收入到底怎么样?
  • 物理笔记-八年级上册
  • Springcloud物流配送后台-计算机毕业设计源码69809
  • 区块链的介绍和应用场景以及发展趋势
  • GORM更新操作(Save、Update、Updates)
  • 十大人力资源SAAS软件:企业管理的革新者
  • 【学术会议征稿】第三届环境遥感与地理信息技术国际学术会议(ERSGIT 2024)
  • 职业教育大数据实验实训室建设应用案例
  • 听专家的,不如听国家的,网络安全究竟值不值得报?
  • 人大高瓴发布Think-on-Graph 2.0,基于知识图的大模型推理再升级!
  • 《Java编程思想》读书笔记-对象导论
  • 【面试系列】之二:关于js原型
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • Fabric架构演变之路
  • JAVA SE 6 GC调优笔记
  • JavaWeb(学习笔记二)
  • Java到底能干嘛?
  • nodejs实现webservice问题总结
  • use Google search engine
  • 产品三维模型在线预览
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 机器学习学习笔记一
  • 简单基于spring的redis配置(单机和集群模式)
  • 看域名解析域名安全对SEO的影响
  • 前端_面试
  • 如何用vue打造一个移动端音乐播放器
  • 深度学习入门:10门免费线上课程推荐
  • 说说动画卡顿的解决方案
  • 一个项目push到多个远程Git仓库
  • 最近的计划
  • postgresql行列转换函数
  • ​Python 3 新特性:类型注解
  • # C++之functional库用法整理
  • #{} 和 ${}区别
  • #define用法
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • (1)Android开发优化---------UI优化
  • (C#)一个最简单的链表类
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (二)WCF的Binding模型
  • (二)正点原子I.MX6ULL u-boot移植
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (实战篇)如何缓存数据
  • (一)Kafka 安全之使用 SASL 进行身份验证 —— JAAS 配置、SASL 配置
  • (译) 函数式 JS #1:简介
  • (转)大型网站架构演变和知识体系
  • (转载)OpenStack Hacker养成指南
  • .Net 8.0 新的变化
  • .NET Core MongoDB数据仓储和工作单元模式封装