缘起
前一段日子,同事遇到了一个奇怪的现象 —— B 模块调用了 A 模块某个类的成员函数,没有依赖 A 模块,编译时没有报错。而 C 模块也调用了 A 模块中同一个类的成员函数,没有依赖 A 模块,编译时却报了链接错误。
简单语音沟通后觉得不太可能。用了 A 模块的函数,却不依赖 A 模块,有点儿不讲道理!
因为当时我没在电脑前,跟同事简单沟通了几个可以设置库依赖的位置,结果都没有发现对应的依赖项。
心里越发觉得不可思议,难道 B 模块是通过其它方式依赖 A 模块的?正常情况下,如果 B 模块依赖 A 模块,一定可以在 B 模块的导入表中看到 A 模块相关的记录。于是建议同事查看 B 模块的导入表,但是同事不太熟悉。因为项目比较急,遂建议同事在 C 模块中添加对 A 模块的依赖,先解决项目问题,后面有机会再调查具体原因。
直到最近才有时间调查这个问题,结果发现这个问题非常有意思 —— B 模块确实没有依赖 A 模块(B 模块的导入表中确实没发现 A 模块的相关项),但是 B 模块确实调用了 A 模块中的函数,而且不是通过 LoadLibrary() + GetProcAddress() 的方式调用的。
本文主要关注以下问题,如果你已经有了答案,可以跳过本文。
B模块在什么情况下可以调用A模块中的函数,但是却不依赖A模块?