为 32 位 exe 加载 32 位库时,Windows 7 64 位路径不正确

Posted

技术标签:

【中文标题】为 32 位 exe 加载 32 位库时,Windows 7 64 位路径不正确【英文标题】:windows 7 64 bits incorrect PATH when loading 32 bits library for 32 bits exe 【发布时间】:2011-11-11 12:03:39 【问题描述】:

我有一个依赖于 libeay32.dll 的 exe。两者都编译为 32 位。

我已将 exe 复制到 C:\Program files (x86)\app\bin 并将 dll 复制到 C:\Program files (x86)\app\lib。 为确保正常工作,我已将 C:\Program files (x86)\app\lib 添加到路径中。

在 Windows 7 64 位上,当我执行 exe 时,出现 libeay32.dll not found 错误。

使用 32 位依赖遍历器,该库正确位于 C:\Program files (x86)\app\lib。 使用 sysinternal 进程资源管理器,应用程序可以正确执行。 使用 cmd 也可以。 使用 64 位的依赖walker,我可以看到缺少的库。 将这两个文件一起复制或将 dll 复制到 syswow64 也可以完美地工作。

如果应用程序是为 32 位编译的...

为什么 windows 不寻找 32 位库? 如果目录已经在路径上,为什么不解析库?

我的猜测是 w7 忽略了路径,但据此: http://msdn.microsoft.com/en-us/library/ms682586%28v=vs.85%29.aspx 它不应该!。

为什么我不能在路径上运行依赖项的 exe? 我应该注册图书馆还是什么?

任何想法将不胜感激。

编辑:

从开始菜单->程序完成时,程序正确启动/执行,但不是直接在 .exe...wtf 上?

使用 procmon 似乎是在尝试打开(注意缺少“”): “C:\Program Files(x86)\myapp\Third-Party\openssl\LIBEAY32.dll” 但在路径中它是正确的(重新检查:“C:\Program Files (x86)\myapp\Third-Party\openssl”)

回答?: 是否有已知的场景/错误在路径上设置 “C:\Program Files (x86)”,导致窗口尝试加载“C:\Program Files(x86)”????(请参阅使用没有任何过滤器的 procmon)

Windows 7 x64 错误?

【问题讨论】:

据我所知,PATH 仅用于查找可执行文件。 Lib 或 DLL 不能自行执行 - 只能支持另一个可执行文件。 @Arun - Windows 确实使用路径来定位 DLL。见msdn.microsoft.com/en-us/library/7d83bc18.aspx 我的错,我收回。是的,它确实。非常感谢您纠正我的错误! 您应该使用 regsvr(32) 注册文件 libeay32.dll,而不是复制文件。我假设 Windows 会自动加载库。 @Nick regsvr32 用于 COM 注册 - 除非 dll 是导出 DllRegisterServerDllUnregisterServer 的 COM 组件,否则只会失败。 【参考方案1】:

您可以将 lib 移动到同一目录中,因为它总是首先检查。如果找到,则使用它。 在 Windows 64 位系统上,您也可以(未尝试)将库移动到存储 32 位版本的 SystemWOW64 文件夹,但我会推荐第一个版本。

【讨论】:

以上是关于为 32 位 exe 加载 32 位库时,Windows 7 64 位路径不正确的主要内容,如果未能解决你的问题,请参考以下文章

如何在运行时后期绑定 32 位/64 位库

在 OS X 上将 32 位二进制库包装到 64 位库

将 32 位库链接到 64 位程序

此错误是由运行在 32 位 JVM 中的 Java 程序访问的 64 位库引起的吗?

报错:尝试加载 Oracle 客户端库时引发 BadImageFormatException。如果在安装 32 位 Oracle 客户端组件的情况下以 64 位模式运行,将出现此问题。

Ubuntu 16.04 不支持 32 位库吗?