SWIG, Box2D и C #

То, что должно быть простым, превратилось в запутанный беспорядок уродства. Итак, вот история. Я скачал замечательный Box2D, вынул важные файлы c ++ и добавил интерфейс для SWIG. Затем я приступил к созданию оболочки Swig с помощью make-файла

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 в файле интерфейса). Так что я «делаю глоток» в Cygwin, никаких проблем там нет (пришлось переупорядочивать, чтобы базовые классы были первыми). Затем я загрузил его в 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)

В моих попытках исправить это, большая часть Googling решила, что, возможно, виновником было соглашение о вызовах, поэтому я изменил файл cpp SWW-оболочки для экспорта функций в dll как __cdecl, а не __stdcall, и соответствующим образом обновил оболочку.

Так или иначе, поэтому я в конце концов исправил смешивание x86 / x64, создав новый профиль сборки x86, а затем при вызове любой функции в dll программа просто зависла. Поэтому я решил вернуться к основам и просто скомпилировать с __stdcall, без модов-обёрток, и просто посмотреть, сработает ли это.

Это не так.

Теперь жалуется, что пропущены точки входа:

{"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. Не решение

Я пытался скомпилировать DLL как с minGW, так и с Cygwin, поэтому я сомневаюсь, что способ компиляции DLL — большая проблема.

Кто-нибудь знает, что я делаю не так?

2

Решение

Так что получается, что C # не может в Cygwin или MinGW dll, поэтому я перекомпилировал с VSC ++, и все прошло нормально.

2

Другие решения

Других решений пока нет …