2012-09-13 33 views
7

隨着iPhone 5和其他armv7s設備的出現,與現有的(閉源)第三方框架(如Flurry)存在兼容性問題,這些框架沒有這種新的架構。是否有編譯器標誌來指示armv7s體系結構的缺乏

一種選擇是等到他們發佈一個新的版本,但我希望可能有一個編譯器標誌或我可以在我的Xcode項目中使用的東西,讓鏈接器知道不要期望從這個框架的armv7架構,並改用armv7。有這樣的事嗎?

+10

**由於第三方**之間的NDA,Stack Overflow沒有關閉或刪除問題。主持人不是在這裏強制兩個獨立的第三方之間的協議。不管它是否是NDA,如果它是一個實用的,可回答的問題,並符合堆棧溢出質量指南,那麼問題就保持開放和不被刪除。 – casperOne

+1

嘿馬特。只是想給你一個快速更新,Flurry在9月14日星期五發布了支持armv7s的4.0.3。昨天,9月17日有一個後續版本4.0.4,用於刪除一些編譯器警告。 –

+0

謝謝,我發佈後幾分鐘就收到了。 – coneybeare

回答

10

加載不包含目標體系結構的框架是不可能的。

你可以做的只是發佈armv7應用程序,直到框架更新。該應用程序仍然可以在iPhone 5上運行,只是不使用它提供的最新性能優化。

或者,如果你可以在沒有框架的情況下在新的架構上生活,那麼你可能會弱化它的聯繫。但是,然後你需要檢查你的代碼是否在你使用框架中的東西時加載。

6

GCC中曾經有一個鏈接器標誌,allow_sub_type_mismatches,它可以讓你在鏈接庫中混合搭配ARM架構版本,但它們似乎在最近版本的Xcode中已經消失了。

但是,這實際上可能會以不同的方式入侵;使框架,查看其內容,在十六進制編輯器打開它的內部實際的代碼庫文件,副本做以下全部更換:

CEFAEDFE 0C000000 09000000 

CEFAEDFE 0C000000 0B000000 

什麼你基本上做的是改變每個代碼對象的頭部以將其標識爲ARMv7而不是ARMv7代碼 - 指令集向後兼容(或者似乎是,無論如何),所以即使使用這種黑客,它也應該運行良好,儘管我不得不承認,除非我們真的有機會在iPhone 5上測試它,否則我們不會知道。

無論如何,一旦您修改了框架,只需將兩個版本添加到您的項目並鏈接到每個體系結構中適當的一個。您也可以通過使用lipo來合併修改的和原始的庫來創建新的單一框架。

+2

這正是我所做的,並顯示如何 - http://www.galloway.me.uk/2012/09/hacking-up-an-armv7s-library/。 – mattjgalloway

+0

很酷 - 確實簡化了流程,爲其提供了自動化腳本,並且消除了意外更改與Mach-O標題無關的CEFAEDFE 0C000000 09000000的可能性。 – Ertebolle

+1

你是什麼意思,「在LLVM中帶走」?這是一個鏈接旗幟,因爲大先知扎爾貢的緣故!與編譯器無關,它確實有效,儘管它可能是解決此問題最糟糕的方法(提示:正確的方法是通過將其從架構構建設置中移除來選擇退出ARMv7)。 –

相關問題