2011-05-09 101 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

相關問題