今天心血来潮突然看了一下编译过程中的具体细节,做了如下总结:
首先解释一下编译过程中涉及到的一些文件:
.h,.cpp:
源码文件,用于编译器解析
.obj
编译后的代码和数据,并且有名称,所以在编译过程中会遇到有外部符号未解决的问题。经过查阅资料发现和.exe文件一样,都是二进制文件
并且编译过程中每个.cpp文件都会生成一个.obj文件。理论上link过程中可以用obj链接其他工程,但实际上我们都用的lib文件
.lib .dll
静态链接库:编译时候就需要。函数的索引和实现都在一个文件中。
动态链接库:运行的时候才需要。由.lib文件和.dll文件一起使用(这里的lib文件只是起到一个函数索引的作用,在程序link的时候,
将dll的入口链接导入到exe中,将函数的地址和函数名导入到exe中,具体的函数体在dll中,运行时候在寻址找函数体)。用动态链接库方式要比静态库方式节省很多内存资源。在升级的时候需要将lib和dll文件一起打包升级。
编译过程:
1.预编译
去掉注释
替换宏
递归展开头文件,并且将每个头文件插入到cpp文件中,形成一个大的cpp文件(大的cpp文件使用在编译的时候)
处理预编译指令(#)
预编译过程中不做任何有效信息的类型检查
2.编译
词法优化,语法优化,代码优化,形成obj文件(binary file,在linux中是.o文件)
内联函数的替换就发生在这一阶段
3.链接
将各个模块生成的obj文件link到一起
4.exe
最终生成exe文件
欢迎各位大佬指点纠正,以及补充,技术无罪技术无界限哈哈哈哈