使用交叉编译的 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.dll
和 zlib1.dll
都在可执行文件的文件夹中。 (当然连同其他所需的 DLL)
SDL_image
的版本可以在这里找到:https://www.libsdl.org/projects/SDL_image/release/
我有一个问题,我使用 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.dll
和 zlib1.dll
都在可执行文件的文件夹中。 (当然连同其他所需的 DLL)
SDL_image
的版本可以在这里找到:https://www.libsdl.org/projects/SDL_image/release/