SWIG、Box2D和C#
本来应该简单的事情已经变成了一团令人费解的丑陋。故事是这样的。我下载了令人敬畏的Box 2D,取出了重要的C++文件,并添加了Sigg的接口。然后,我继续使用makefile创建Swig包装器SWIG、Box2D和C#,c#,c++,box2d,swig,C#,C++,Box2d,Swig,本来应该简单的事情已经变成了一团令人费解的丑陋。故事是这样的。我下载了令人敬畏的Box 2D,取出了重要的C++文件,并添加了Sigg的接口。然后,我继续使用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) $
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
在我试图解决这个问题的过程中,谷歌的大部分内容都解决了调用约定可能是罪魁祸首的问题,因此我更改了SWIG包装器cpp文件,将函数作为u cdecl而不是u stdcall导出到dll中,并适当地更新了包装器
无论如何,我最终修复了x86/x64的混合,创建了一个新的x86构建配置文件,然后调用dll中的任何函数,程序就挂起了。所以我决定恢复到基础,只需使用u stdcall编译,不使用包装器mods,然后看看它是否能工作
没有
现在它抱怨它缺少入口点:
{"Unable to find an entry point named 'SWIGRegisterExceptionCallbacks_box2d' in DLL 'box2d'.":""} System.Exception {System.EntryPointNotFoundException}
在转储DLL的导出后,函数将根据u stdcall被正确地损坏
CSharp_b2_aabbMultiplier_get@0
...
SWIGRegisterStringCallback_box2d@4
SWIGRegisterExceptionCallbacks_box2d@44
等等等等
现在C#wrapper端似乎没有发现这是一个问题,直接向前走,忽略了损坏
[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的编译方式是一个很大的问题
有人知道我做错了什么吗?结果证明C不能转换成Cygwin或MinGW DLL,所以我用VSC++重新编译,一切都很顺利
[DllImport("box2d", EntryPoint="SWIGRegisterExceptionArgumentCallbacks_box2d@44")]