2

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

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

过程入口点 inflateValidate 无法位于动态链接库 D:\libpng16-16.dll 中。

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

objdump -x libpng16-16.dll | grep 膨胀

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 符号,所以我缺少什么吗?有人知道如何解决这个问题吗?

提前致谢

4

3 回答 3

3

只是偶然发现了同样的问题。原来是 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)
            ...

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

于 2017-09-03T05:07:20.477 回答
0

在我的情况下,我替换了 libpng16-16 文件并且工作正常。

于 2021-03-16T00:24:14.793 回答
0

我在尝试运行一些基于libpng16-16.dll. 显然 SDL_Image 的某些构建版本被破坏:https ://github.com/libsdl-org/SDL_image/issues/131 ,本文讨论 : https ://discourse.libsdl.org/t/sdl2-image-fails-加载-libpng-on-latest-versions-when-cross-compile/24494/

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

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

于 2022-02-28T14:54:06.260 回答