静态库的应用程序在模拟器上运行,但在实际设备上运行

时间:2011-05-09 08:01:07

标签: iphone ios4 xamarin.ios

我有一个包含objective-c静态库的monotouch应用程序。应用程序在模拟器上正确运行,但是当我尝试在iPhone 3GS上运行应用程序时,它在启动时崩溃。这些是我尝试使其运行的步骤:

  • 编译了Xcode中的静态库,指定了设备,并且在armv6和armv7设置了活动架构(我不确定哪个是正确的,但我尝试了两者都没有工作)。
  • 在项目信息下,我将代码签名身份设置为我的开发人员密钥。
  • 在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应用程序中。

4 个答案:

答案 0 :(得分:3)

我必须进行两项更改才能在iphone上正常工作:

    构建选项中的
  1. 链接器行为必须设置链接所有程序集选项。
  2. 我必须将 -framework Security 添加到gcc_flags。
  3. 所以构建选项下的其他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?