プラグインで拡張できる Windows 専用のゲームと、使用したい Linux ライブラリがあります。アプリケーション (Unity ゲーム) は Wine/Proton で正常に動作します。私は Winelib がこれを行うことができることを発見しました。私はUser's Guide、特に私の正確なユースケースについて言及している 5 番目のセクションに従っていました。
いくつかの試行 (winemaker から --single-target arg を削除するなど) の後、Proton デバッグ ログに STATUS_BAD_IMAGE_FORMAT と思われる c000007b が表示され続けるポイントに到達しました。
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/ にコピーし、ネイティブ ライブラリを 1 つ上のレベル (lib64/) にコピーし、その他を削除しました
- また、lib64/ の代わりに lib/ にコピーしようとしました
- ファイルの dll オーバーライドを追加し、組み込みに設定しました
- 参照されている DLL (odbc32、ole32、oleaut32、winspool、odbccp32) とライブラリ (uuid) をメイクファイルから削除しました。
--mno-cygwin
コンパイラ フラグに追加する-m64
コンパイラ/リンカー フラグにとを追加( Wine 仕様ファイル-fPIC
に基づく)- 私も .def ファイルを作成してそれを使用しようとしました
--nomsvcrt
引数を追加して再度 winemaker を使用し、実行しましたmake
(ヘッダー ファイルには string.h が含まれています)。
Proton ログから (+module、他の人は私にそれ以上の情報を提供しませんでした):
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 が発生します。
ワインのバージョン (winebuild、winegcc): 5.9 (ステージング) - gcc 9.0.1
プロトン バージョン: 5.0 - wine-5.0-603-g068dee4