gpt4 book ai didi

c# - SWIG、Box2D 和 C#

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:53:03 34 4
gpt4 key购买 nike

本应简单的东西变成了令人费解的丑陋困惑。所以这是故事。我下载了很棒的 Box2D,取出了重要的 c++ 文件并为 SWIG 添加了一个接口(interface)。然后我继续使用 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

很正常的东西,而且工作正常(在修复接口(interface)文件中的 %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 进行编译,没有包装器 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# wrapper end 似乎没有发现这个问题,直接忽略了 mangling

[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++ 重新编译,一切正常。

关于c# - SWIG、Box2D 和 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13684574/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com