MSVC dll链接的顺序

MSVC Order in which DLLs are linked

本文关键字:顺序 链接 dll MSVC      更新时间:2023-10-16

我调试一个链接到两个dll的应用程序。当这些dll中的一个对象被实例化时,应用程序就会出现分段错误。然而,当(VS2010)链接器->输入->附加依赖中的.lib文件的顺序被交换时,应用程序运行良好。

这个解决方法目前有效,但我仍然想了解是什么导致了这个问题。任何提示,我如何进一步调试这个?

在没有更多信息的情况下,任何答案都只能是猜测,一个可能的原因如下:

  1. 在Windows中,每个DLL都有DLLMain()函数

  2. 一旦你有两个dll,它们将有两个DllMain()函数调用

  3. 如果两者之间存在依赖关系(即一个DLLMain()隐式依赖于在另一个DLLMain()中初始化的对象)-你有问题。

我自己也见过这样的问题(这显然是一个糟糕的编程实践,但它确实发生了)。然而,也可能存在一些其他的解释。

调试它的方法将是调试任何崩溃的方法:从在捕获段错误时检查堆栈开始。如果在调试构建时再现崩溃,那么理解直接原因应该是很简单的(根本原因通常需要更深入的调查)。

如果不查看这个堆栈,就无法说明崩溃的原因,但是可以合理地假设涉及到全局资源。一个命名的事件,通用的临时文件,也许是一些内部框架结构(如果有的话,你的代码中涉及到框架?)-但它必须是跨越单个DLL边界的东西,因此可能是应用程序范围内的资源。