【问题标题】:Wrong architecture for Delay-Loaded Library延迟加载库的错误架构
【发布时间】:2014-09-25 11:17:52
【问题描述】:

在 Windows 上,我的 x64 库 (foo.dll) 对另一个与 32 库 (foreignlibrary.dll) 同名的 x64 库 (foreignlibrary.dll) 具有延迟加载的依赖关系。当然,它们位于不同的目录中。通常使用数字,如 msvcr110.dll 或 msvcr120.dll,但在这种情况下它不是。

我的库无法加载,因为(至少这是依赖 walker 告诉我的)因为它加载了 32 位版本的 foreignlibrary.dll。

它似乎是它找到的第一个具有此名称的名称。如何确保加载了正确的 x64 库。

【问题讨论】:

  • 部署那个 x86 版本到底有什么意义呢?它永远不会有用。仅使用 foo.dll 的 x86 版本部署它
  • 我没有部署外部(32位)库,它已经像msvcr110.dll的32位版本一样在系统上,我对此无能为力。我只是说这个库似乎已加载,因为名称匹配,因此似乎不存在其他检查。
  • 很不清楚为什么它会发现该 DLL 的错误位数,Windows 对此有非常具体的对策。例如,32 位进程被重定向到 c:\windows\syswow64 和 c:\program 文件 (x86)。无论如何,将您所依赖的任何 DLL 放在与 EXE 相同的目录中。那是操作系统首先出现的地方,它永远不会出错。复制 msvcr110.dll 的正确位数由您决定
  • 通过许可,我可能不允许发送/复制/修改 dll,所以我可能会迷失在这里。认为windows中的这个manifest-hell和lookup-procedure可以避免这些问题。
  • 这完全取决于第三方库是如何设置的。你有没有问过供应商你应该怎么做?无论如何,您总是可以选择在运行时加载库,而不是使用加载时间或延迟加载。 (题外话但重要的警告,因为您已经提到了许可:一些开发人员声称您必须拥有许可才能开发动态链接到其 DLL 的代码。如果您不确定相关许可是否授予您许可这样做,您可能需要咨询律师。)

标签: windows dll dllimport


【解决方案1】:

在运行加载 foo.dll 的应用程序之前,请设置环境以将 64 位 foreignlibrary.dll 的位置添加到 PATH 变量的前面。当您的应用程序需要加载 foreignlibrary.dll 时,它会先在您指定的位置找到一个,然后再在 32 位目录中找到一个。

您可以自己修改系统路径,或者(我更喜欢)制作一个 .bat 文件来设置 PATH,然后运行您的可执行文件。

假设您的 .bat 与您的 exe 位于同一位置,并且您的库位于 libs64 中:

@echo off
PATH=libs64;%PATH%
prog.exe

【讨论】:

  • 修改路径环境变量可能会起作用,但我想知道是否嵌入带有所需 DLL 的清单也可能会解决问题? foreignlibrary.dll 必须满足任何要求,以便我可以在清单中使用它吗?
【解决方案2】:

原来是英特尔编译器中的一个错误。

【讨论】:

    【解决方案3】:

    dependency walker 的这个警告不必担心; Windows 与依赖遍历器不同,它将忽略错误的 DLL 文件并继续搜索正确的体系结构之一。如果搜索路径中没有这样的文件,就是你有问题的时候。

    实际上,对于延迟加载的库,即使这样也不一定是问题:通常,这些库之所以延迟加载,正是因为它们是可选的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多