使用交叉编译的 libpng16-16.dll 在 w10 上无法执行

Execution impossible on w10 with a cross compiled libpng16-16.dll

我有一个问题,我使用 mxe(x86_64-w64-mingw32.shared 在 linux 上为 windows 构建并 link 一个 windows 应用程序),构建 linking 运行良好。然后我复制粘贴所有有用的 dll(都是交叉编译的,除了 x64-msvcrt-ruby230.dll,这是我从官方 windows 安装程序获得的)。

我用 wine 测试了我的程序,没问题,它工作得很好,我发现与 linux 版本没有区别。但是一旦我把所有东西都放在我的测试虚拟机中(windows10 64bit inside virtualbox)我收到错误消息:

The procedure entry point inflateValidate could not be located in the dynamic link library D:\libpng16-16.dll.

libpng16-16.dll 在那里,当我对象转储它时(在 linux 中):

objdump -x libpng16-16.dll | grep inflate

3a9f4      60  inflate
3aa00      66  inflateEnd
3aa10      69  inflateInit2_
3aa20      73  inflateReset
3aa30      74  inflateReset2
3aa40      80  inflateValidate
[642](sec  1)(fl 0x00)(ty  20)(scl   3) (nx 0) 0x0000000000013be0 png_inflate_claim
[654](sec  1)(fl 0x00)(ty  20)(scl   2) (nx 0) 0x0000000000014280 png_zlib_inflate
[655](sec  1)(fl 0x00)(ty  20)(scl   3) (nx 0) 0x00000000000142d0 png_inflate.constprop.6
[657](sec  1)(fl 0x00)(ty  20)(scl   3) (nx 0) 0x0000000000014680 png_inflate_read.part.3.constprop.8
[3002](sec  1)(fl 0x00)(ty  20)(scl   2) (nx 0) 0x0000000000021b08 inflateReset2
[3023](sec  1)(fl 0x00)(ty  20)(scl   2) (nx 0) 0x0000000000021b28 inflate
[3081](sec  1)(fl 0x00)(ty  20)(scl   2) (nx 0) 0x0000000000021b00 inflateValidate
[3088](sec  8)(fl 0x00)(ty   0)(scl   2) (nx 0) 0x0000000000000578 __imp_inflateReset2
[3119](sec  8)(fl 0x00)(ty   0)(scl   2) (nx 0) 0x0000000000000568 __imp_inflateInit2_
[3138](sec  8)(fl 0x00)(ty   0)(scl   2) (nx 0) 0x0000000000000560 __imp_inflateEnd
[3143](sec  1)(fl 0x00)(ty  20)(scl   2) (nx 0) 0x0000000000021b10 inflateReset
[3155](sec  8)(fl 0x00)(ty   0)(scl   2) (nx 0) 0x0000000000000558 __imp_inflate
[3162](sec  8)(fl 0x00)(ty   0)(scl   2) (nx 0) 0x0000000000000580 __imp_inflateValidate
[3197](sec  8)(fl 0x00)(ty   0)(scl   2) (nx 0) 0x0000000000000570 __imp_inflateReset
[3244](sec  1)(fl 0x00)(ty  20)(scl   2) (nx 0) 0x0000000000021b20 inflateEnd
[3253](sec  1)(fl 0x00)(ty  20)(scl   2) (nx 0) 0x0000000000021b18 inflateInit2_

显然符号 __imp_inflateValidate 存在,所以我缺少什么吗?有人知道如何解决这个问题吗?

提前致谢

刚遇到同样的问题。原来是 PATH 环境变量中的冲突 dll 文件。尝试 ldd 命令找出哪些 dll 文件可能是可疑的。

例如,就我而言,罪魁祸首是来自英特尔无线软件的 zlib1.dll。


    E:\samples\sfmlSound>ldd sfmlSound.exe
            ntdll.dll => /c/WINDOWS/SYSTEM32/ntdll.dll (0x7ffee3e70000)
            KERNEL32.DLL => /c/WINDOWS/System32/KERNEL32.DLL (0x7ffee3030000)
            ...
            zlib1.dll => /c/Program Files/Intel/WiFi/bin/zlib1.dll (0x7ffed0f10000)
            ...

解决冲突后,程序将正确加载。

在我的例子中,我替换了 libpng16-16 文件并且成功了。

我在尝试 运行 一些基于 libpng16-16.dll 的代码时偶然发现了一个类似的问题。显然 SDL_Image 的某些构建版本已损坏:https://github.com/libsdl-org/SDL_image/issues/131,在本文中讨论: https://discourse.libsdl.org/t/sdl2-image-fails-loading-libpng-on-latest-versions-when-cross-compiling/24494/

对我来说,它可以回滚到旧版本并确保 libpng16-16.dllzlib1.dll 都在可执行文件的文件夹中。 (当然连同其他所需的 DLL)

SDL_image 的版本可以在这里找到:https://www.libsdl.org/projects/SDL_image/release/