如何将Cocoa Touch静态库链接到MonoTouch项目?

4
我已经使用Xcode 4创建了一个Cocoa Touch静态库,我想在MonoTouch项目中使用它。我该怎么做?
这是我的静态库内容:

MyClass.h
header

MyClass.m
implementation


我按照此博客文章中的步骤使用“构建归档”进行构建,并将生成的libMyLib.a添加到一个新的MonoTouch绑定项目中。
binding project

然后我替换了libMyLib.linkwith.cs的内容,因为此博客文章这样说。
[assembly: LinkWith ("libMyLib.a", LinkTarget.ArmV6 | LinkTarget.ArmV7 | LinkTarget.Simulator, ForceLoad = true, Frameworks="CoreGraphics QuartzCore UIKit")]

然后我将这段代码添加到 ApiDefinition.cs 中:
enter image description here

StructsAndEnums.cs 文件我留空。


然后我使用Release模式构建,从bin文件夹中获取dll文件并将其添加到MonoTouch iPad项目的根目录中,并将其添加到引用中。

接着,按照这篇文章中的说明操作后,将mtouch参数设置为以下内容。

-gcc_flags "-L${ProjectDir} -lMyLib -force_load -ObjC"

然后我尝试运行项目,但在“构建输出”中遇到以下错误:

error MT5201: 本地链接失败。请检查提供给gcc的用户标志:“-L/Users/herpderp/Projects/TestProject/TestProject” “-lMyLib” -force_load“/Users/herpderp/Projects/TestProject/TestProject/libMyLib.a” “-L/Users/herpderp/Projects/TestProject/TestProject” “-lMyLib” “-force_load”“-ObjC”

2个回答

1

MT5201 的错误信息告诉您在进行本地链接步骤时发生了错误。这是100%确定的。第二部分要求您检查您的 gcc_flags,这是失败的最常见原因。但是这并不是100%确定的问题。当您寻求帮助时,您应始终粘贴任何错误上面的行(因为它们可能有用)。

错误很可能是关于给本地链接器提供的选项重复了。这是因为您在绑定项目和主项目中都提供了它们。

从您链接的 Binding Objective-C Types 文章中:

或者您可以利用嵌入在合同文件中的汇编级 LinkWithAttribute...

这意味着使用 LinkWith 属性时不需要额外的 mtouch 参数。由于您正在使用此方式(最佳方式 :-))来绑定静态库,因此可以跳过此步骤(从主项目中)。

通过这样做,你为自己(以及使用你的库的任何人)提供了方便,因为这样可以减少不同步的风险(例如库更新或不同的构建配置)。

当我删除额外的mtouch参数时,什么都不起作用。我可以从我的绑定中调用MyClass.Test("str"),但是什么也没有发生,而且我不知道我的绑定有什么问题。这可能与我的xcode项目缺少编译器标志有关吗?或者因为我在构建静态库时选择了“Build For Archiving”? - Louis Boux
什么都不起作用,虽然它已经构建成功了,但之前并没有(所以我会称之为进步;-)。现在为什么呢?很难说。.a是一个可从模拟器/设备测试应用程序中使用的fat库吗? - poupou

1

那很有帮助,我只是修改了示例项目以适应我的需求。 - Louis Boux

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接