缘起
上一篇文章——《调试实战 —— dll 加载失败之全局变量初始化篇》中,跟大家分享了一个由于全局变量初始化顺序导致的 dll
加载失败的例子。感兴趣的小伙伴儿可以点击阅读。
虽然我们知道了是由于全局变量初始化顺序导致的问题,也给出了解决方案。但是有一点却没有刨根问底——为什么改变文件在工程文件中的顺序就可以改变全局变量初始化顺序?是怎么影响的呢?本篇文章力求解决这个问题。
了解 Build
我们可以简单的把整个编译过程分成三个步骤(当然实际还有其它步骤,我们一般不关心):预编译,编译,链接。
预编译: 处理宏,#include
展开等。
编译: 以编译单元为单位生成对应的 .obj
文件。
链接: 把生成的.obj
文件和必要的文件链接成最后的应用程序。
猜想
因为编译是把符号放到对应的 .obj
中,链接的时候才把对应的 .obj
文件链接成最后的应用程序。链接的时候应该是按照 .obj
文件出现的先后顺序依次把 .obj
中的符号放到对应的位置。