2011-05-09 95 views
1

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

  • 编译在Xcode静态库设备规定和有源体系在ARMv6的集和ARMv7的(我不知道这是正确的,但我试了两次,都没有工作)。
  • 在项目信息下,我将代码签名标识设置为我的开发人员密钥。

    :在MonoDevelop中我已经通过设置额外的MonoTouch参数iPhone打造有以下值(这等同于什么设置为iPhoneSimulator)包含在应用项目选择静态库
  • -v -v -v -gcc_flags “-lstdC++ -I $ {PROJECTDIR} /的UltraLite /包含-L $ {PROJECTDIR} /的UltraLite -lUltralite -force_load $ {PROJECTDIR} /Ultralite/libUltralite.a”

当我尝试运行应用程序时,它在启动时崩溃(s o应用程序屏幕甚至不出现)。在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消息确实没有给我太多的帮助。

更新: 我创建了一个按键,点击它时调用静态库的方法的sayHello一个简单的Hello World应用程序。即使有这个基本的例子,我也遇到了同样的问题。即它在模拟器上运行,但不在实际设备上运行。我已经将我的helloworld示例上传到github。如果有人能帮助我完成这项工作,我将不胜感激。这里是世界您好样本:

https://github.com/BruceHill/HelloWorld

这包括基本的应用程序文件夹,用Objective-C的静态库文件夹,然后终于在btouch定义的文件夹。我用参数-outdir =调用btouch。构建Messaging.g.csUltraliteManager.g.cs然后将其包含在MonoTouch应用程序中。

+0

精华:0主题名称:调度队列:com.apple.main线程 螺纹0坠毁: 0 Mobileforms \t 0x00fc0c1c mono_aot_get_class_from_name(AOT-runtime.c:1497) 1 Mobileforms \t 0x010225b0 mono_class_from_name( class.c:7092) 2 Mobileforms \t 0x0103ce80 mono_exception_from_name_domain(exception.c:58) 3 Mobileforms \t 0x0103ce38 mono_exception_from_name(exception.c:35) 4 Mobileforms \t 0x0103d418 mono_get_exception_null_reference(exception.c:280) – BruceHill 2011-05-09 09:40:59

+0

我现在一个是更接近解决这个问题。我已经设法通过修改_Don't link_到_Link SDK程序集only_的构建选项中的_Linker行为_设置来实现我的_Hello World_示例。但是,当我在实际应用程序中进行此更改时,出现错误“mtouch failed with no output”,并在构建日志下看到链接器错误,指出符号未定义。例如,它说libUltralite.a中的“_SecRandomCopyBytes”和“_SecKeyGetBlockSize”是未定义的。 – BruceHill 2011-05-10 08:38:03

回答

3

我不得不作出两个变化让这个在iPhone上正常工作:在构建选项

  1. 链接器行为不得不选择连接所有组件集。
  2. 我不得不将-framework安全添加到gcc_flags。

所以额外的MonoTouch参数下的编译选项必须有以下值:

-v -v -v -gcc_flags“-framework安全-lstdC++ -I $ {} PROJECTDIR /的UltraLite /包括-L $ {} PROJECTDIR /的UltraLite -lUltralite -force_load $ {} PROJECTDIR /Ultralite/libUltralite.a”

我不得不添加安全框架的原因是,它似乎的MonoTouch包括这个框架的时候不要链接在构建选项中指定,但在另外两个选项不包含它时s被设置。我通过比较不同选项的构建日志来确定这一点。从崩溃报告

0

尝试添加“-ObjC”到您的链接器标志。

更新: 似乎有关于静态libraties的一些问题。您也可以尝试使用-all_load标志:What does the -all_load linker flag do?

+0

感谢您的回复,克劳斯。我曾尝试添加_-ObjC_,但它没有任何区别。不过要指出的是,我的静态库是一个C++库的包装器,因此在链接器标志中包含_-lstdC++ _。 _ObjC_包含哪些标志? – BruceHill 2011-05-09 09:30:47

+0

对QA中的-ObjC标志有详细的解释:http://developer.apple.com/library/mac/#qa/qa1490/_index。html – 2011-05-09 09:54:53

+0

我已经尝试了-all_load标志,不幸的是它没有帮助。 :( – BruceHill 2011-05-09 10:59:37

1

Open XCode Organizer。插入你的设备。然后看看崩溃。数据将具有象征意义,并且您至少会看到它失败的几点。

+0

谢谢,Ivink,我确实弄清楚我可以看到XCode组织者的崩溃日志。不幸的是,这里列出的所有符号似乎都表明崩溃发生在单层,所以日志中没有任何意义但是我通过对我的Hello World示例进行了测试,发现了这个错误,似乎这个错误与选项中的_Linker behaviour_设置有关,请参阅我对此问题的最新评论以了解详细信息 – BruceHill 2011-05-10 08:04:56

1

我有一个类似的问题,通过BTouch链接第三方库的MonoTouch。相同的例外类型和代码。

您必须获取该第三方库的源代码并在禁用THUMB的情况下进行编译。 XCode有这个选项,只是在选项中搜索THUMB。 libUltralite.a最终会变大一些。

+0

Thanks, Matt,我以前遇到过THUMB的问题,并且在我的图书馆里已经禁用了,但是我更接近解决这个问题;请参阅我对这个问题的最新评论。 – BruceHill 2011-05-10 08:17:35

相关问题