Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SWIG、Box2D和C#_C#_C++_Box2d_Swig - Fatal编程技术网

SWIG、Box2D和C#

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) $

本来应该简单的事情已经变成了一团令人费解的丑陋。故事是这样的。我下载了令人敬畏的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) $(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")]