使用交叉编译的libpng16-16.dll在w10上执行是不可能的

时间:2017-05-02 10:29:03

标签: c++ linux mxe

我有一个问题,我使用mxe(x86_64-w64-mingw32.shared)在Linux上构建并链接windows应用程序,构建链接工作正常。然后我复制粘贴所有有用的dll(这些都是交叉编译的,除了x64-msvcrt-ruby230.dll,我从官方的Windows安装程序获得)。

我用葡萄酒测试了我的程序,没问题就像魅力一样,我发现没有与linux版本有任何区别。但是,一旦我将所有内容放入我的测试虚拟机(虚拟机内的Windows10 64位),我收到错误消息:

  

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

libpng16-16.dll就在那里,当我在objectdump它时(在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存在,所以我有什么遗漏?有人知道如何解决这个问题吗?

提前致谢

2 个答案:

答案 0 :(得分:1)

偶然发现了同样的问题。事实证明,它是PATH环境变量中的一个confilicting 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)
            ...

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

答案 1 :(得分:0)

在我的情况下,我替换了 libpng16-16 文件并且有效。