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

项目编译过程

  • 预处理
  • 编译
  • 汇编
  • 链接

1.预处理

首先新建preprocess.cpp文件,输入代码:

#include<iostream>
#define add(a,b) a+b
int main()
{
        int c = 1;
        int d = 2;
        int e = add(c,d);
       std::cout<<e<<std::endl;
        return 0;
}

其中#define add(a,b) a+b为宏定义了两个数相加。生成预处理文件看看:

命令框输入

g++ --help

-E是生产预处理选项

输入命令:

g++ -o preprocess.i -E preprocess.cpp

生成preprocess.i预处理文件,vim打开后,非编辑模式下:/int main() ,然后回车可以找到main函数

add被替换了,这就是预处理的主要工作。

总结:预处理主要进行宏的展开,以及把头文件包进来,所以.i文件开起来很大,事实上.i文件依然是源文件,只不过做了一些符合计算机下一步工作的处理,因此叫做预处理。

 

   2.编译

编译阶段是编译器将.i文件转换为.s文件,可以通过命令:

g++ -o preprocess.s -S preprocess.i

生产preprocess.s文件,打开可以看到都是汇编代码

另外:不同编译器有着不同的约定(比如__cdecl和__stdcall的约定;__fastcall约定)

     编译器也做一些优化,gcc/g++编译时可以通过-O配置,有0,1,2,3,s共5中级别,0就是不做优化。

总结:编译过程就是通过语法分析,将其翻译成汇编代码

  3.汇编

汇编阶段是汇编器将汇编代码翻译成机器指令,可以通过命令:

g++ -o preprocess.o -c preprocess.s

生成目标文件preprocess.o,其实就是二进制文件。

通过下面命令查看:

objdump -s -d preprocess.o

查看文件结构(符合ELF格式,参考https://blog.csdn.net/xuehuafeiwu123/article/details/72963229)

objdump -h preprocess.o

   4.链接

由目标文件生成可执行文件,链接包括静态链接和动态链接。

g++ -o preprocess preprocess.o

生成可执行文件preprocess,./preprocess可直接执行。

静态链接:将静态库拷贝到可执行文件中;(文件较大)

动态链接:只记录相关信息,动态链接库的内容会映射到虚拟地址,通过映射关系来找到对应的代码。

-fPIC

http://blog.sina.com.cn/s/blog_54f82cc201011op1.html

 

相关文章:

  • Python报错:IndentationError: unindent does not match any outer indentation level
  • Windows无法启动MongoDB服务。错误1053
  • Redis的持久化
  • Redis需要知道的几个问题
  • 分布式消息队列【笔记】
  • 设计模式之---【发布订阅模式】
  • 设计模式之---【工厂模式】
  • 理解Epoll
  • 虚拟机ubantu18.04与Windows7共享文件夹(samba)
  • win10 “你不能访问此共享文件夹,因为你组织的安全策略阻止未经身份验证的来宾访问。”
  • 安装lua报错:fatal error: readline/readline.h: No such file or directory
  • 【重学Linux系列(一)之一一Linux命令】
  • C盘突然满了,找了好几天。。。
  • ubantu18.04server配置IP
  • int与CString互转
  • python3.6+scrapy+mysql 爬虫实战
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • C# 免费离线人脸识别 2.0 Demo
  • C学习-枚举(九)
  • eclipse的离线汉化
  • Hibernate最全面试题
  • HTTP那些事
  • java8-模拟hadoop
  • JavaScript设计模式系列一:工厂模式
  • Java编程基础24——递归练习
  • Java教程_软件开发基础
  • js正则,这点儿就够用了
  • Nodejs和JavaWeb协助开发
  • springboot_database项目介绍
  • tab.js分享及浏览器兼容性问题汇总
  • Travix是如何部署应用程序到Kubernetes上的
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 理解在java “”i=i++;”所发生的事情
  • 深入浅出Node.js
  • 温故知新之javascript面向对象
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 怎么把视频里的音乐提取出来
  • 终端用户监控:真实用户监控还是模拟监控?
  • 1.Ext JS 建立web开发工程
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (第61天)多租户架构(CDB/PDB)
  • (汇总)os模块以及shutil模块对文件的操作
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (学习日记)2024.01.09
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • (转)mysql使用Navicat 导出和导入数据库
  • .NET 常见的偏门问题
  • .Net 代码性能 - (1)
  • .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)...
  • .NET/C# 使窗口永不获得焦点
  • .Net6支持的操作系统版本(.net8已来,你还在用.netframework4.5吗)