2014-03-07 53 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标记为不可选项。