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

Posted

技术标签:

【中文标题】无法为架构 arm64 和 x86_64 构建 opencv ios 框架【英文标题】:Unable to build opencv ios framework for architecture arm64 and x86_64 【发布时间】:2014-03-07 09:51:05 【问题描述】:

我在编译一个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 **

然后,经过多次尝试,我发现如果只编译架构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 架构编译的任何想法?谢谢。

【问题讨论】:

【参考方案1】:

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

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

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

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

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

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

【讨论】:

【参考方案2】:

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

你在用什么?我猜不是 Xcode?​​p>

除非您希望它在 64 位 mac 笔记本电脑或台式机上运行,​​否则您不需要编译到 x86_64……而且您的问题似乎没有尝试这样做?

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

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

【讨论】:

感谢您的 cmets。我现在正在用 xcode 为 ios(ipad 和 iphone)编译。其实我的mac是64位的桌面,所以我的机器可以在64位上运行。 iPhone 5s 也是 64 位的【参考方案3】:

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

pod 'OpenCV'

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

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

【讨论】:

以上是关于无法为架构 arm64 和 x86_64 构建 opencv ios 框架的主要内容,如果未能解决你的问题,请参考以下文章

docker如何构建多架构(arm64, x86_64, armv7)容器镜像?

警告“将架构 arm64 映射到 x86_64”是啥意思?

Zbar SDK - 缺少所需的架构 x86_64

Xcode 无法构建 React Native 项目,架构 x86_64 的未定义符号

iOS 指令集arm64、armv7s、armv7、i386、x86_64

如何限制 Nativescript 仅针对 x86_64 进行编译?