即使目录已添加到 PATH,Wine 也无法加载 DLL

问题描述 投票:0回答:1

我正在尝试使用 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

c++ wine
1个回答
0
投票

有多种方法。首先,让我们将问题形式化:

$ 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

解决方案:

  1. 静态链接核心库:
    $ 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
    
  2. 使用
    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
    
  3. 安装 Windows 版本的 MinGW,然后使用它来编译应用程序。但是,据我记得,如果您想分发生成的可执行文件,您仍然需要静态链接 MinGW 库,或者将它们与二进制文件一起提供。因此,唯一的区别在于
    1
    是二进制文件应该在您的 WINEPREFIX 下运行,无需任何修改。
  4. 使用
    wineg++
    。我提到它只是为了完整性,我认为这是最无用的解决方案。它会生成一个 Linux 文件,该文件本身可能没问题,可以用它来进行调试。然而,在我的测试中,即使 mingw 毫无问题地链接到同一个 dll,我也没有设法对 dll 进行
    wineg++
    链接。它似乎链接到 .so 文件,即使您用它构建的应用程序可以动态加载
    .dll
    文件。奇怪的实用程序。
    $ wineg++ test.cpp -o a
    $ WINEDEBUG=-all,err+module wine ./a.exe
    hello
    
© www.soinside.com 2019 - 2024. All rights reserved.