关于编译

本文详细解析C++的编译过程,包括预处理、编译、汇编和链接。区分了函数声明与定义,强调了编译器对待.cpp和.h文件的不同。深入探讨了静态链接和动态链接的原理,分析了它们的优缺点,指出动态链接在节省内存和更新便利性上的优势,以及静态链接在执行效率上的优势。
摘要由CSDN通过智能技术生成

本篇文章解决的问题

阐明项目编译链接的具体过程,详述静态和动态链接的原理与优缺点。
从这些原理几乎能找出所有链接错误的根本原因,比如由于链接问题出现重复定义函数或变量的报错,等等。

概念

  • 函数声明:本文中的函数声明就是函数的头部(有些书上叫函数原型,感觉字面上理解有点容易理解为定义),不带花括号的。
  • 函数定义:指的是函数的具体实现,带{花括号}的

编译主体文件

注意C ++的编译器只会将.cpp的后缀文件作为编译主体,对应生成目标文件.o(或.obj),而.h文件不会生成目标文件,如其后缀名head(h)所表现的含义,仅作为文件头加入到.cpp中

编译步骤( 1

(1)编译

目标:本步骤的最终生成文件就是二进制目标文件.o,注意每一个.cpp都会生成一个对应的文件.o,而且相互间的生成是独立的,链接是下一步干的事。若使用g++,进行对每一个.cpp进行编译,语法:

g++ -c fName.cpp  [-o Name.o]	
//-c用于指出只是生成目标文件,无需进行连接
//[-o Name.o]若省略,默认生成与待编译的原文件同名的.o文件

对于.cpp文件中引用的外部变量与函数,不会报错

  • 预处理:

    • 预处理又称为预编译,是做些代码文本替换工作。处理文件中的#部分,比如将#define定义的宏进行替换,#include的.h文件代码加入的.cpp中(完全copy)(生成.i文件)
  • 编译优化

    • 通过预编译输出的.i文件中,只有常量:数字、字符串、变量的定义,以及c语言的关键字:main、if、else、for、while等。这阶段要做的工作主要是,通过语法分析和词法分析,确定所有指令是否符合规则,之后翻译成汇编代码。(将.i文件转化位.s文件)
  • 汇编

    • 汇编过程就是把汇编语言翻译成目标机器指令的过程,生成目标文件(.obj .o等)。目标文件中存放的也就是与源程序等效的目标的机器语言代码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值