シンプルであるべきものが、醜さの複雑な混乱に変わっています。これが話です。すばらしい Box2D をダウンロードし、重要な C++ ファイルを取り出し、SWIG のインターフェイスを追加しました。次に、makefile を使用して Swig ラッパーを作成しました。
CC=g++
CFLAGS=-c -Wall -fPIC -I../
LDFLAGS=-shared -o box.dll
SOURCES=<OMITTED>
OBJECTS=$(SOURCES:.cpp=.o)
EXECUTABLE=box2d.dll
all: $(SOURCES) $(EXECUTABLE)
$(EXECUTABLE): $(OBJECTS)
$(CC) $(LDFLAGS) $(OBJECTS) -o $@
.cpp.o:
$(CC) $(CFLAGS) $< -o $@
swig:
swig -csharp -c++ -outdir Wrapper Box2D.i
clean:
-rm Collision/*.o
-rm Collision/Shapes/*.o
-rm Common/*.o
-rm Dynamics/*.o
-rm Dynamics/Contacts/*.o
-rm Dynamics/Joints/*.o
-rm Rope/*.o
かなり正常なもので、正常に動作します (インターフェイス ファイルの #include ではなく %include を修正した後)。だから私はcygwinで「swigを作ります」、そこに問題はありません(基本クラスが最初に来るようにインクルードを並べ替える必要がありました)。次に、VS.NET 2012 にロードし、すべてのラッパー .cs ファイルをソリューションにコピーし、DLL を移動しました。ここが厄介なところです。
初めて、大きな問題を引き起こしたのは x86 と x64 が混在していたと思います。これが問題であることがすぐにわかり、非常に説明的なエラー メッセージに混乱することはありませんでした。
System.BadImageFormatException: An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)
これを修正する試みの中で、グーグルの多くはおそらく呼び出し規約が原因であると解決したので、SWIG ラッパーの cpp ファイルを変更して、関数を __stdcall ではなく __cdecl として dll にエクスポートし、ラッパーを適切に更新しました。
とにかく、新しいx86ビルドプロファイルを作成してx86/x64の混合を最終的に修正し、dllの関数を呼び出すと、プログラムがハングしました。そこで、基本に戻って、__stdcall のみでコンパイルし、ラッパー mod を使用せずに、動作するかどうかを確認することにしました。
そうではありませんでした。
エントリ ポイントが見つからないというメッセージが表示されるようになりました。
{"Unable to find an entry point named 'SWIGRegisterExceptionCallbacks_box2d' in DLL 'box2d'.":""} System.Exception {System.EntryPointNotFoundException}
DLL のエクスポートをダンプすると、関数は __stdcall に従って正しくマングルされます。
CSharp_b2_aabbMultiplier_get@0
...
SWIGRegisterStringCallback_box2d@4
SWIGRegisterExceptionCallbacks_box2d@44
などなど
現在、C# ラッパー エンドはこれを問題とは認識していないようで、直進し、マングリングを無視します。
[DllImport("box2d", EntryPoint="SWIGRegisterExceptionArgumentCallbacks_box2d")]
だから私は絶望からこれを試しました
[DllImport("box2d", EntryPoint = "SWIGRegisterExceptionCallbacks_box2d", CallingConvention = CallingConvention.StdCall)]
これは同じ問題に遭遇しました。ソリューション?壊れた名前を貼り付けます。
[DllImport("box2d", EntryPoint="SWIGRegisterExceptionArgumentCallbacks_box2d@44")]
... 1392 個の DllImport 属性すべて。解決策ではありません。
minGW と Cygwin の両方で DLL のコンパイルを試みたので、DLL のコンパイル方法が問題になるとは思えません。
誰かが私が間違っていることを知っていますか?