本篇文章解决的问题
阐明项目编译链接的具体过程,详述静态和动态链接的原理与优缺点。
从这些原理几乎能找出所有链接错误的根本原因,比如由于链接问题出现重复定义函数或变量的报错,等等。
概念
- 函数声明:本文中的函数声明就是函数的头部(有些书上叫函数原型,感觉字面上理解有点容易理解为定义),不带花括号的。
- 函数定义:指的是函数的具体实现,带{花括号}的
编译主体文件
注意: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等)。目标文件中存放的也就是与源程序等效的目标的机器语言代码。
-