c++ obj文件
- obj文件就是目标文件,是源程序经过编译程序编译后生成的
- 不能直接执行,需要连接程序连接后才能生成可执行文件,这样就能执行
- 一般由机器代码组成,但也可以是自己定义的一些伪指令代码(需有专门的解释程序对其进行解释执行)
连接程序
obj文件与exe文件的区别
- 编译:当前源代码编译成二进制目标文件(obj文件)
- 链接(link): 将生成的.obj文件与库文件.lib等文件链接,生成可执行文件(.exe文件)
- project中每个cpp经编译成为obj(object)文件,所有obj文件和资源问价经连接(link)成为可执行文件,obj文件可称为目标文件或中间文件。obj文件只给出了程序的相对地址,而exe是绝对地址
现代编译器的主要工作流程
源程序(source code)→ 预处理器(preprocessor)→ 编译器(compiler)→ 汇编程序(assembler)→ 目标程序(object code)→ 连接器(链接器,Linker)→ 可执行程序(executables)
函数模板的声明和实现
- 函数模板的声明和实现一般都放在.h文件中
- 模板是在需要的时候,才会去生成一个具体的实例化。模板本身是不会被执行的(模板本身不产生汇编指令),是模板生成的具体实例化才产生指令
模板的实现为什么放在.h中
- 编译器一次只能处理一个单元,即一次处理一个cpp文件,实例化时需要看到该模块的完整定义,若头文件中只有声明,没有定义,编译器就无法实例化该模块,最终会导致链接(link)错误,所以放在头文件中
- 若你坚持不想放在.h中,试试include "xxx.cpp"这种奇葩的做法也是可以的
(完)