无法为架构arm64和x86_64构建opencv ios框架

时间:2014-03-07 09:51:05

标签: c++ ios opencv

编译ios框架时,我正在关注opencv安装文档Installation in iOS。但是,如果我没有更改platform/ios/build_framework.py并构建框架,我将遇到以下错误:

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 **

然后,经过多次尝试,我发现如果我只通过更改platform/ios/build_framework.py中的以下脚本来编译架构armv7,armv7s和i386,则可以成功构建框架。

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架构的任何想法?谢谢。

3 个答案:

答案 0 :(得分:2)

取出i386并编译armv7,armv7s和arm64--这些是Xcode for 64位的架构选项 - iphone5s。

不要混合他们不会和不能混合的英特尔和手臂规格。架构命令用于通知编译器如何创建目标代码。因为intel是CISC处理器而arm是RISC内部,它们的目标代码是非常不同的。 例如,MOVE命令可以为英特尔生成x'80'代码(命令指令),但为ARM生成x'60'。据我所知,i386是旧的英特尔32位架构,Xcode可能会有一些神奇的功能,可以在intel和RISC上运行通用目标代码 - 如果这样做的话 - 效率不高,它总是会更好编译到特定的体系结构。

32位,64位128 .....是寻址模式 - 它们也是处理器寄存器的大小,并决定CPU可以访问多少内存(RAM)。通常,除了具有巨大RAM的能力之外,更高位处理器通常会减少执行特定任务的指令数量。

由于通常内置向下兼容性,因此为armv6编译的应用程序通常在兼容模式下以armv7甚至arm64运行,但它无法利用运行真正的64位应用程序的优势。

目标是更高级别的规范,它指定可以使用哪些命令,例如iPad具有UIPopViewController,但iPhone或iPod touch不支持此功能。

最后一件事 - 只有iPhone 5s可以与arm64配合使用,如果你设置了另一个目标,它可能会将arm64标记为不是一个选项。

答案 1 :(得分:0)

因此,如果您正在为x86_64架构进行编译,那就是OS X(笔记本电脑或Mac塔),而不是iOS(iPad,iPhone)。

你在用什么?我认为不是Xcode吗?

除非您希望在64位Mac笔记本电脑或台式机上运行,​​否则无需编译到x86_64。看起来好像你试图用你的问题做到这一点?

另外,如果你有它用于i386,它可能与大多数OS X机器兼容 - 它只能运行32位而不是64位。

就arm64而言,这也可能是64位。你可能没有64位的库?你的机器是64位运行的吗?检查opencv库(动态或静态?)&看看他们是32还是64?如果它们是32位那么那就是问题所在。您需要将它们构建为64位库或查找它们。不知道你在哪个平台上,我不能再给你信息了。

答案 2 :(得分:0)

我最近了解到iOS的OpenCV已添加到CocoaPods。您可以看到podspec here和Github存储库here。使用CocoaPods,您可以在项目的根目录中创建一个名为Podfile的文件,并粘贴到以下行:

pod 'OpenCV'

保存文件并从终端运行pod install(假设当然安装了CocoaPods)。

我在iPhone 5S上运行,也是64位。