我正在尝试使用 mingw32-w64 在 Linux 上交叉编译 Windows 软件并使用 wine 运行它。然而 wine 无法加载
libstdc++-6.dll
库文件。我在网上搜索了一下,发现必须将包含DLL文件的目录放入路径注册表中。就我而言,该目录是 Z:\bin\i686-w64-mingw32\bin
。
然后我尝试使用
wine executable.exe
运行编译后的文件,输出是:
0100:err:module:import_dll Loading library libstdc++-6.dll (which is needed by L"Z:\\home\\sunnymonster\\dev\\c++\\opengl-tests\\cmake-build-debug\\opengl_tests.exe") failed (error c000007b).
0100:err:module:LdrInitializeThunk Importing dlls for L"Z:\\home\\sunnymonster\\dev\\c++\\opengl-tests\\cmake-build-debug\\opengl_tests.exe" failed, status c0000135
我已验证我使用的是正确的 wine 前缀。
附加信息:
Linux 发行版:Manjaro Linux 21.2.5
Linux 内核:5.16.14-1
有多种方法。首先,让我们将问题形式化:
$ cat test.cpp
#include <iostream>
int main() { std::cout << "hello" << std::endl; }
$ i686-w64-mingw32-g++ test.cpp -o a && WINEDEBUG=-all,err+module wine ./a.exe
0024:err:module:import_dll Library libgcc_s_dw2-1.dll (which is needed by L"Z:\\tmp\\a.exe") not found
0024:err:module:import_dll Library libstdc++-6.dll (which is needed by L"Z:\\tmp\\a.exe") not found
0024:err:module:LdrInitializeThunk Importing dlls for L"Z:\\tmp\\a.exe" failed, status c0000135
解决方案:
$ i686-w64-mingw32-g++ test.cpp -o a -static-libgcc -static-libstdc++ -Wl,-Bstatic -lstdc++ -lpthread -Wl,-Bdynamic
$ WINEDEBUG=-all,err+module wine ./a.exe
hello
WINEPATH
环境。告诉 wine 加载 dll 的附加路径的变量。在示例中,我将 wine 抱怨的 mingw dll 的位置传递给它。它在您的系统上可能有所不同,您可能会通过要求包管理器列出 mingw-g++/gcc 包中的文件来找到它(无论它在您的系统上被称为什么)。多个路径应该用分号分隔。
$ i686-w64-mingw32-g++ test.cpp -o a
$ WINEDEBUG=-all,err+module WINEPATH=/usr/i686-w64-mingw32/sys-root/mingw/bin/ wine ./a.exe
hello
1
是二进制文件应该在您的 WINEPREFIX 下运行,无需任何修改。wineg++
。我提到它只是为了完整性,我认为这是最无用的解决方案。它会生成一个 Linux 文件,该文件本身可能没问题,可以用它来进行调试。然而,在我的测试中,即使 mingw 毫无问题地链接到同一个 dll,我也没有设法对 dll 进行wineg++
链接。它似乎链接到 .so 文件,即使您用它构建的应用程序可以动态加载 .dll
文件。奇怪的实用程序。
$ wineg++ test.cpp -o a
$ WINEDEBUG=-all,err+module wine ./a.exe
hello