2014-03-07 51 views
2

編譯ios框架時,我遵循opencv安裝文檔Installation in iOS。但是,如果我沒有改變platform/ios/build_framework.py,並建立框架,我有以下錯誤:無法爲架構arm64和x86_64構建opencv ios框架

build settings from command line: 
    ARCHS = x86_64 
    IPHONEOS_DEPLOYMENT_TARGET = 6.0 
    SDKROOT = iphonesimulator6.1 

Build Preparation 
Build task concurrency set to 8 via user default IDEBuildOperationMaxNumberOfConcurrentCompileTasks 

=== BUILD AGGREGATE TARGET ZERO_CHECK OF PROJECT OpenCV WITH CONFIGURATION Release === 
Check dependencies 


=== BUILD NATIVE TARGET zlib OF PROJECT OpenCV WITH CONFIGURATION Release === 

=== BUILD NATIVE TARGET libjpeg OF PROJECT OpenCV WITH CONFIGURATION Release === 

** BUILD FAILED ** 

Build settings from command line: 
    ARCHS = x86_64 
    IPHONEOS_DEPLOYMENT_TARGET = 6.0 
    SDKROOT = iphonesimulator6.1 

=== BUILD NATIVE TARGET zlib OF PROJECT OpenCV WITH CONFIGURATION Release === 
Check dependencies 
No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=x86_64, VALID_ARCHS=i386). 


** BUILD FAILED ** 

然後,多次嘗試之後,我發現,如果我只編譯通過改變建築的ARMv7,armv7s和i386在platform/ios/build_framework.py的腳本中,可以成功構建框架。

targets = ["iPhoneOS", "iPhoneOS", "iPhoneSimulator"] #"iPhoneOS", "iPhoneSimulator" 
    archs = ["armv7", "armv7s", "i386"]#"arm64", , "x86_64" 
    for i in range(len(targets)): 
     build_opencv(srcroot, os.path.join(dstroot, "build"), targets[i], archs[i]) 

關於如何編譯arm64和x86_64架構的任何想法?謝謝。

回答

0

因此,如果您正在編譯x86_64架構,那是針對OS X(筆記本電腦或Mac塔),而不是iOS(iPad,iPhone)的。

你在用什麼?不是我假設的Xcode?

你不需要編譯爲x86_64,除非你想讓它在64位的Mac筆記本電腦或臺式機上運行... &它似乎並不像你試圖通過你的問題來做到這一點?

另外,如果你有它的i386它可能與大多數OS X機器兼容 - 它只會運行在32位而不是64位。

至於arm64,那也可能是64位。你可能沒有64位的庫?您的機器是否在64位上運行?檢查opencv庫(動態還是靜態?)&看看它們是32還是64?如果他們是32位那麼這就是問題所在。您需要將它們構建爲64位庫或者像這樣找到它們。不知道你在哪個平臺上,我無法再給你提供信息。

+0

感謝您的意見。我現在正在爲xcode編譯ios(ipad和iphone)。事實上,我的Mac是64位桌面,所以我的機器可以在64位上運行。 – feelfree

+0

iPhone 5s也是64位的 – JoeyJAL

0

我最近才知道OpenCV for iOS已被添加到CocoaPods。您可以看到podspec here和Github存儲庫here。隨着的CocoaPods,你在你的項目的根目錄創建一個名爲Podfile一個文件,並在這一行粘貼:

pod 'OpenCV' 

保存文件並運行從終端pod install(假設的CocoaPods安裝過程中)。

我有這個在我的iPhone 5S上運行,這也是64位。

2

取出i386並編譯爲armv7,armv7s和arm64--這些是64位iphone5s的Xcode的體系結構選項。

不要混合intel和arm規範,他們不會混合。體系結構命令是通知編譯器如何創建目標代碼。因爲intel是CISC處理器,arm在內部是RISC,所以它們的目標代碼是非常不同的。 舉例來說,MOVE命令可能會爲intel生成一個x'80'opcode(命令指令),但爲ARM生成一個x'60'。據我所知,i386是舊的intel 32位架構,Xcode可能會做一些神奇的事情,讓普通的對象代碼可以在intel和RISC上運行 - 如果這樣做的話 - 效率不高,總是會更好編譯到特定的體系結構。

32位,64位128 .....尋址模式 - 它們也是處理器寄存器的大小,並決定CPU可以訪問多少內存(RAM)。一般來說,除了擁有巨大RAM的能力之外,高位處理器通常會減少執行特定任務的指令數量。

由於通常內置向下兼容性,爲armv6編譯的應用程序通常在兼容模式下運行在armv7或arm64中,但它無法利用運行真正的64位應用程序的優勢。

目標是一個更高級別的規範,它指定可以使用哪些命令,例如iPad具有UIPopViewController,但這在iPhone或iPod touch中不受支持。

最後一件事 - 如果您設置了另一個目標,則只有iPhone 5可以與arm64一起使用,它可能會將arm64標記爲不可選項。