我有一个仅限 Windows 的游戏,可以通过插件和我想使用的 Linux 库进行扩展。该应用程序(Unity 游戏)在 Wine/Proton 下运行良好。我发现 Winelib 可以做到这一点,并且我遵循了用户指南,特别是第 5 节,其中提到了我的确切用例。
经过一些尝试(比如从酿酒师中删除 --single-target arg),我到了 Proton 调试日志一直显示 c000007b 似乎是 STATUS_BAD_IMAGE_FORMAT 的地步。
请注意,我重命名了 Linux 库(并与之链接),以避免它与我的包装器之间的潜在冲突。
我只有一个 64 位版本的库,它是使用 cdecl 调用约定从 C# 代码调用的。这是我迄今为止尝试过的(以及这些的组合):
- 添加了一个包含内容的 .spec 文件(首先没有 -arch 并且具有不同的序数):
1 cdecl -arch=x86_64 LibraryFunc (long ptr ptr) LibraryFuncWine
- 添加了库的头文件和一个 .c 文件:
#include "library_header.h"
#include <windef.h> /* Part of the Wine header files */
enum ELibResult WINAPI LibraryFuncWine(Version version, struct CreateParams* params, struct ICore** result)
{
enum ELibResult ret = LibraryFunc(version, params, result);
return ret;
}
winemaker --nosource-fix --dll --nomfc -I. -L. -llinux_library .
那时用过的酿酒师make
- 复制整个游戏中的 .dll.so 文件
- 将 .dll.so 文件复制到 steamapps/common/Proton 5.0/dist/lib64/wine/ 并将本机库复制到更高级别 (lib64/) 并删除其他库
- 还尝试复制到 lib/ 而不是 lib64/
- 为文件添加了 dll 覆盖并将其设置为内置
- 从 makefile 中删除了引用的 DLL(odbc32、ole32、oleaut32、winspool、odbccp32)和库(uuid)
- 添加
--mno-cygwin
到编译器标志 - 添加
-m64
和-fPIC
到编译器/链接器标志(基于Wine 规范文件) - 我也尝试过制作一个 .def 文件并使用它
- 再次使用 winemaker 并
--nomsvcrt
添加并运行参数make
(头文件包括 string.h)
从质子日志(+模块,其他人没有为我提供更多信息):
00dc:trace:module:load_dll looking for L"Z:\\D\\a\\library\\path\\library_name" in L"Z:\\D\\gamepath;C:\\windows\\system32;C:\\windows\\system;C:\\windows;C:\\Program Files (x86)\\Steam;.;C:\\windows\\system32;C:\\windows;C:\\windows\\system32\\wbem;C:\\windows\\system32\\WindowsPowershell\\v1.0"
00dc:trace:module:get_load_order looking for L"Z:\\D\\a\\library\\path\\library_name.dll"
00dc:trace:module:get_load_order_value got standard key b for L"library_name"
00dc:trace:module:load_builtin_dll Trying built-in L"library_name.dll"
00dc:trace:module:load_so_dll loading L"\\??\\Z:\\D\\a\\library\\path\\library_name.dll" from so lib "/D/Games/SteamLibrary/steamapps/common/Proton 5.0/dist/bin/../lib64/wine/library_name.dll.so"
00dc:warn:module:load_dll Failed to load module L"Z:\\D\\a\\library\\path\\library_name"; status=c000007b
使用和不使用 .dll 并以 lib 开头(library_name.dll、liblibrary_name 和 liblibrary_name.dll)重复相同的操作。
除了该错误代码之外,我无法获得更多关于究竟出了什么问题的日志。
在 C# 端(由 Unity 在 Proton 中运行)它会导致 DllNotFoundException。
Wine 版本 (winebuild, winegcc): 5.9 (staging) - gcc 9.0.1
质子版本:5.0 - wine-5.0-603-g068dee4