2

シンプルであるべきものが、醜さの複雑な混乱に変わっています。これが話です。すばらしい 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 のコンパイル方法が問題になるとは思えません。

誰かが私が間違っていることを知っていますか?

4

1 に答える 1

2

したがって、C# は Cygwin または MinGW dll に変換できないことが判明したため、VSC++ で再コンパイルしたところ、すべてうまくいきました。

于 2012-12-04T01:27:56.773 に答える