【问题标题】:MSVC Order in which DLLs are linkedMSVC 链接 DLL 的顺序
【发布时间】:2015-05-29 07:30:48
【问题描述】:

我调试了一个链接到两个 DLL 的应用程序。当实例化来自这些 DLL 之一的对象时,应用程序会出现段错误。但是,当 (VS2010) Linker->Input->Additional Dependencies 中的 .lib 文件的顺序被交换时,应用程序运行良好。

此解决方法目前有效,但我仍然想了解导致问题的原因。任何提示,我该如何进一步调试?

【问题讨论】:

  • 如果没有任何改变,this 可能是您的问题的解决方案
  • 本文讨论如何更改链接顺序。但是我想知道为什么链接顺序会有所不同,以避免将来出现此类问题。
  • 也说了为什么,仔细阅读

标签: c++ visual-studio dll linker


【解决方案1】:

虽然没有更多信息,但任何答案都必然是猜测,一个潜在的原因如下:

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

  2. 只要有两个 DLL,它们就会有两个 DllMain() 函数调用

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

我自己也遇到过这样的问题(这显然是一种糟糕的编程习惯,但确实会发生)。但是,也可能存在许多其他解释。

【讨论】:

    【解决方案2】:

    调试此问题的方法是调试任何崩溃的方法:首先检查段错误捕获处的堆栈。如果崩溃在调试版本中重现,理解直接原因应该很简单(根本原因通常需要更深入的调查)。

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

    【讨论】:

      猜你喜欢
      • 2011-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-31
      • 2010-12-04
      • 2023-03-22
      相关资源
      最近更新 更多