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

很正常的东西,它工作正常(在接口文件中修复 %includes 而不是 #includes 之后)。所以我在 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)

在我尝试解决这个问题时,大部分谷歌搜索都认为调用约定可能是罪魁祸首,因此我更改了 SWIG 包装器 cpp 文件以将函数作为 __cdecl 而不是 __stdcall 导出到 dll 中,并适当地更新了包装器。

无论如何,所以我最终通过制作一个新的 x86 构建配置文件来修复 x86/x64 混合,然后在调用 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 属性。不是解决方案。

我已经尝试使用 minGW 和 Cygwin 编译 DLL,所以我怀疑 DLL 的编译方式是一个很大的问题。

有人知道我做错了什么吗?

4

1 回答 1

2

所以事实证明 C# 不能进入 Cygwin 或 MinGW dll,所以我用 VSC++ 重新编译,一切都很好。

于 2012-12-04T01:27:56.773 回答