2012-09-19 42 views
17

我正在使用openCV框架的iphone應用程序。 一切工作正常。然而,最近的iOS 6和XCode的4.5釋放我被遷移我的項目的Xcode 4.5 在構建我遇到這個錯誤:OpenCV.Framework不編譯爲armv7s架構

ld: file is universal (2 slices) but does not contain a(n) armv7s slice: /Users/jobs/iPhone_Client/workspace/MyProject/third-party/OpenCV.framework/OpenCV for architecture armv7s clang: error: linker command failed with exit code 1 (use -v to see invocation)

** BUILD FAILED **

The following build commands failed: Ld build/MyProject.build/Debug-iphoneos/MyProject.build/Objects-normal/armv7s/MyProject normal armv7s (1 failure)

我的理解,這是由於新armv7s架構。 OpenCV顯然不是用armv7編譯的。

我該如何解決這個問題?

我在哪裏可以找到與armv7s架構兼容框架的新版本?

如果沒有兼容框架可用,是否有一種方式來獲得源代碼,並建立自己的圖書館對新架構編譯?也許一些關於如何做的快速步驟?

注:只是要注意,我需要建立armv7s沒有的ARMv7。 謝謝

+0

我與舊版本的RestKit框架有同樣的問題。有一個由RestKit提供的新版本,只需要在使用該框架的代碼中進行很多更改。當我找到一些我會讓你知道的。 –

+0

http://stackoverflow.com/questions/9539617/iphone-opencv-libraries-built-for-armv7 – Ken

+0

@Ken是的,我正在使用這一個,直到新的架構出來。我需要它爲armv7s鏈接提供的是armv7(沒有s) – Youssef

回答

15

這個答案建立在n9986給出的答案上。正如他的建議,我發現克隆庫在

https://github.com/jonmarimba/OpenCV-iOS

當我下載了它多次提到的項目,不同的庫被打破這很奇怪裏面,但他們很容易修復。修正後,它的行爲與所描述的n9986完全相同,輸出爲armv7和armv7s編譯的庫。然而,爲了我的目的,我要求將它們捆綁到一個框架中,以便它們可以替代我一直使用的舊框架。

此前我已經爲ios here下載了最新版本的Opencv,並且花費了相當多的時間嘗試修改它們的cmake文件以支持armv7s進行編譯。 jonmarimba已經重組了xcode項目文件以剝離它的cmake依賴關係,這使得更改目標架構更加直觀。不幸的是,他並沒有像標準的openCV構建那樣構建更多的庫。我爲jonmarimba的opencv_world項目添加了一個新目標,它是標準openCV版本中用於轉換爲框架的目標。一旦構建完成,我將它用作替代標準openCV版本生成的框架文件結構中的靜態庫。

我創建的框架可以下載here。它對我來說非常適合我,因爲它可以替代我以前的opencv2.framework。但是我注意到jonmarimba沒有轉換opencv_videostab,opencv_stitching或opencv_nonfree的目標。如果您使用其中一個庫,我的框架可能無法爲您工作。如果是這種情況,請告訴我,我可以嘗試將它們設置爲xcode項目中的目標。

更新

要編譯其他架構,更改目標架構,以任何你喜歡的opencv_world庫包括Xcode項目。在你建立之後,去找你剛建立的圖書館。將opencv_world庫重命名爲opencv2,並使用opencv_world替換.framework中找到的庫文件。

UPDATE2

OpenCV 2.4.3現在默認armv7s支持編譯等等這些解決方案已經過時。

+0

+1。感謝您一直致力於製作.framework文件。我有點在這一步變得懶惰。這應該是答案。希望我們可以分割賞金! –

+0

@ n9986我知道。他一路走來,他的回答更好。對不起,我不能把恩賜分給我,我試過了。 (http://meta.stackexchange.com/questions/2786/accept-multiple-answers-or-split-bounty-among-several-users)。不管怎麼說,還是要謝謝你。 – Youssef

+0

@ n9986是的,這將是一個很棒的功能,如果沒有你的回答,我無法做到這一點,我已經花了很長時間沒有到任何地方。非常感謝 – Hammer

1

你總是可以只是沒有目標armv7s,只有目標的ARMv7。您的應用程序仍然可以在iPhone 5上正常運行,但它不會完全針對新指令集進行優化。

+0

我沒有控制的構建。它是一個在服務器上運行的自動構建腳本。我只能發送我的代碼,並建立。然後腳本使用armv7s框架 – Youssef

+0

然後有人最近改變了服務器的配置並破壞了事情。解決這個問題是他們的責任。 – Jim

0

說明顯而易見,您需要重新編譯並重建庫openCV.framework並將其作爲armv7s的目標。

調整庫「項目設置」和「目標設定」之前重建。祝你好運!

+0

我試圖這樣做,但是我在哪裏可以找到openCV的XCode項目? – Youssef

7

克隆Xcode項目的OpenCV的和更新OpenCV的git的子模塊按照自述:

https://github.com/jonmarimba/OpenCV-iOS

檢查構建設置,確保iOS6的和armv7s都存在。點擊構建。你現在應該有armv7兼容的.a文件。我只是試過這個:

$ file libopencv_core.a 
libopencv_core.a: Mach-O universal binary with 2 architectures 
libopencv_core.a (for architecture armv7): current ar archive random library 
libopencv_core.a (for architecture cputype (12) cpusubtype (11)): current ar archive random library 

最後一項是針對armv7s,根據我目前的研究。

編輯:最後一項確實是armv7s。我跑了Xcode的自己脂info命令:

$ xcrun -sdk iphoneos lipo -info libopencv_core.a 
Architectures in the fat file: libopencv_core.a are: armv7 armv7s 
+0

它聲明如此,但它不適用於armv7s架構。與上面相同的錯誤。 – Youssef

+0

你也可以試試這個庫:http://www.galloway.me.uk/2012/09/hacking-up-an-armv7s-library/看看這是否有效。這是一種破解成功構建的方法,但每個人都在報告該方法的成功。 –

+0

@ n9986偉大的建議,我發現,但我還沒有能夠得到它的工作。他的腳本工作正常,並且新的有效架構被添加到庫中,但仍然存在錯誤。如果你設法讓它工作,請發佈詳細信息 – Hammer

0

通行證-DCMAKE_OSX_ARCHITECTURES="armv6;armv7;armv7s;i386"來編譯OpenCV庫/框架的iOS時cmake的。

+0

你有沒有使用它,並有它的工作?它不適合我。 – Hammer

+1

這實際上對我來說,最終。必須將該行添加到build_framework.py腳本中,並且我已經構建了帶有armv7,armv7s和i386庫的OpenCV2.framework。 (我不需要armv6,所以我刪除了它。) – Liron

1

簡而言之,我從here克隆了源,並使用this tutorial構建。

然後我得到了與armv7,armv7s和模擬器一起使用的opencv2.framewok。