我有一个包含objective-c静态库的monotouch应用程序。应用程序在模拟器上正确运行,但是当我尝试在iPhone 3GS上运行应用程序时,它在启动时崩溃。这些是我尝试使其运行的步骤:
在MonoDevelop中,我通过在 iPhone build 下设置附加monotouch参数来将静态库包含在应用程序项目选项中,以获得以下值(这是与为iPhoneSimulator设置的相同:
-v -v -v -gcc_flags“-lstdc ++ -I $ {ProjectDir} / Ultralite / Include -L $ {ProjectDir} / Ultralite -lUltralite -force_load $ {ProjectDir} /Ultralite/libUltralite.a”
当我尝试运行应用程序时,它在启动时崩溃(因此甚至没有显示应用程序屏幕)。在MonoDevelop中,我看到的是以下异常消息:
Exception of type 'Mono.Debugger.Soft.VMDisconnectedException' was thrown.
我在设备登录Xcode中看到的所有内容如下:
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_PROTECTION_FAILURE at 0x2fd00f24
如果从项目选项中删除-gcc_flags选项,则应用程序启动,但在第一次尝试访问静态库时崩溃。所以它肯定与静态库有关,导致应用程序在启动时崩溃。
我不知道从哪里开始解决这个问题,所以真的需要一些帮助。任何人都对我所包含的静态库有什么问题有所了解,或者知道在哪里可以获得有关出错的更多信息?崩溃报告中的KERN_PROTECTION_FAILURE消息实际上并没有给我太多帮助。
更新: 我创建了一个简单的Hello World应用程序,它有一个按钮,单击该按钮会在静态库中调用方法 sayHello 。即使有这个基本的例子,我遇到了同样的问题;即它在模拟器上运行但不在实际设备上运行。我已将我的helloworld示例上传到github。如果有人能帮助我完成这项工作,我将非常感激。以下是Hello World示例:
https://github.com/BruceHill/HelloWorld
这包括基本应用程序的文件夹,带有objective-c静态库的文件夹,最后是btouch定义的文件夹。我用参数-outdir =调用btouch。构建 Messaging.g.cs 和 UltraliteManager.g.cs ,然后将其包含在MonoTouch应用程序中。
答案 0 :(得分:3)
我必须进行两项更改才能在iphone上正常工作:
所以构建选项下的其他monotouch参数必须具有以下值:
-v -v -v -gcc_flags“-framework Security -lstdc ++ -I $ {ProjectDir} / Ultralite / Include -L $ {ProjectDir} / Ultralite -lUltralite -force_load $ {ProjectDir} /Ultralite/libUltralite.a”
我必须添加安全框架的原因是,当构建选项中指定不链接时,MonoTouch似乎包含此框架,但是当其他两个选项是组。我通过比较不同选项的构建日志来确定这一点。
答案 1 :(得分:1)
打开XCode Organizer。插入您的设备。然后看看崩溃。数据将象征性,你至少可以看到它失败了。
答案 2 :(得分:1)
MonoTouch通过BTouch链接第三方库时遇到了类似的问题。相同的异常类型和代码。
您必须获取该第三方库的源代码并在禁用THUMB的情况下进行编译。 XCode有这个选项,只需在选项中搜索THUMB。 libUltralite.a最终会变得更大一些。
答案 3 :(得分:0)
尝试将“-ObjC”添加到链接器标志。
<强>更新强> 关于静态图书似乎存在一些问题。您也可以尝试使用-all_load标志:What does the -all_load linker flag do?