在XCode中包装C ++库

时间:2011-09-14 13:48:42

标签: c++ objective-c xcode xamarin.ios

我需要一些帮助来在XCode中包装C ++库。

我想要实现的是在XCode中创建新库,导入C ++库(我有.a和.h文件),将其包装到Obj-C,这样我就可以将该库导入MonoTouch。

我之所以这样做是因为当我尝试将C ++ lib导入MonoTouch时,由于名称损坏,我不断收到WrongEntryPoint异常。如果我错了,请纠正我,但我无法找到受损的名字,这取决于编译器。

提前谢谢

3 个答案:

答案 0 :(得分:2)

  

如果我错了,请纠正我,但我无法找到受损的名字,这取决于编译器。

技术上你可以。许多编译器共享相同的mangling syntax,也许是安腾最有用和最持久的礼物;-)

然而,当您更新C ++代码时,它会带来它自己的痛苦(例如非原始类型,其他编译器)和维护问题。

你会更好地服务于:

  • 编写 ObjectiveC 包装并使用MonoTouch的 btouch 工具生成绑定;

  • 编写 C 包装并使用.NET p / invoke调用代码;

您的选择,但如果您考虑在其他地方重用C ++ / C#代码(例如Android的Mono),那么使用 C 和p / invoke将是可重用的。

答案 1 :(得分:2)

我肯定会建议在Obj-C库中包装库并使用btouch将库导入MonoTouch。我最近为实现Sybase数据库引擎的C ++库做了这个。如果你看一下我的问题,你会发现很多关于包装C ++库的内容,因为我发布了几次我遇到的问题。

具体来说,您可以查看以下问题:

Linking to a C++ native library in MonoTouch

Wrapping a C++ library in Objective-C is not hiding the C++ symbols

Application with static library runs on simulator but not on actual device

Undefined symbols when linking PhoneGap static library in MonoTouch

Linker options 'Link all assemblies" and "Link SDK assemblies only" causes undefined symbols in 3rd party static library

我还建议,如果您打算使用Obj-C包装器的路径,那么您将获得输出代码并将其包含在您的项目中,而不是包含来自btouch的dll。根据我的经验,代码比dll工作更可靠,尽管dll的问题现在可能已经解决了。但请看一下有关btouch问题的这个问题:

Exception System.InvalidCastException when calling a method bound with btouch that returns an object. MonoTouch bug?

如果您在构建Obj-C包装器时遇到特定问题/问题,请在此处询问并发布一些代码,我相信我或社区的其他成员可以帮助您。

答案 2 :(得分:1)

Bruce,正如您所假设的,我在包装C ++代码时遇到了问题。经过几个小时的阅读和尝试,我无法包装C ++代码。

无论如何,我设法创建了一个由一些虚拟类组成的简单Obj-C库,然后将其导入另一个库。这工作得很好。但是,按照相同的模式,我包含C ++ .a文件和.h文件(我不确定.h是否必须,因为我们可以在构建选项中链接头文件,对吧?)当我编译它时,它去了很好,构建成功,但XCode没有生成新的.a库。

我添加了链接器标志:-ObjC -lNameOfLib 构建中的C ++标准库类型 - 链接必须是静态的吗?和默认隐藏的符号一样?

如果我们可以一步一步地写出啧啧,那将是很好的,因为有大量的各种指令,但我还没有把它推到最后。

我有点困惑......

谢谢你们......