18

当我尝试使用 XCode 7 + iOS SDK 9 使用 OpenCV 2.4 iOS 编译我的 XCode 项目时,XCode 抱怨说

ld: 'opencv2.framework/opencv2(alloc.o)' 不包含位码。您必须在启用位码的情况下重建它(Xcode 设置 ENABLE_BITCODE),从供应商处获取更新的库,或禁用此目标的位码。用于架构 arm64

clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)

并拒绝链接。经过一番谷歌搜索,原来是因为苹果在 App Store 中添加了一个名为 Bitcode 的新功能,用于优化应用程序。虽然 OpenCV iOS 二进制文件尚未更新以包含 Bitcode,但它无法通过链接阶段。

一些参考指出了禁用的临时解决方案,ENABLE_BITCODE因此可以在没有 Bitcode 的情况下完成链接。这将阻止为 Apple Watch 编译应用程序,因为 Bitcode 对于 Watch 应用程序是必需的。因此我的问题是,是否有一些(最简单的)方法可以在启用 Bitcode 的情况下编译 iOS OpenCV?(最好有已编译框架的下载链接)

4

2 回答 2

21

经过一番搜索和试验,我找到了一种使用 Bitcode 从源代码编译 OpenCV iOS 的方法。此处还提供了已编译的二进制文件:[v3.0] [v2.4]。[免责声明:我不对编译后的二进制文件的完整性负责。使用风险自负。]

编译步骤与官方文档基本相同,只是多了一个步骤。

  1. 使用 git 下载代码:

    cd ~/<my_working_directory>

    git clone https://github.com/Itseez/opencv.git

  2. 为 Xcode 制作符号链接,让 OpenCV 构建脚本找到编译器、头文件等。

    cd /

    sudo ln -s /Applications/Xcode.app/Contents/Developer Developer

  3. 【关键步骤】修改编译脚本,为Bitcode添加额外的选项:edit~/<my_working_directory>/opencv/platform/ios/build_framework.py,找到包含-DCMAKE_C_FLAGS. 添加-fembed-bitcode. 例如,在我得到的源代码中,它是第 55 行,看起来像

    "-DCMAKE_C_FLAGS=\"-Wno-implicit-function-declaration -fembed-bitcode\" " +

    改变后。[参考]

  4. 构建 OpenCV 框架:

    cd ~/<my_working_directory>

    python opencv/platforms/ios/build_framework.py ios

    如果一切正常,几分钟后你就会得到~/<my_working_directory>/ios/opencv2.framework. 您可以将此框架添加到您的 Xcode 项目中。

PS 问一个问题,即使您已经知道根据Meta Stackchange 上 的这篇文章鼓励答案。

于 2015-09-22T07:05:08.210 回答
8

OpenCV 正是那种可能具有手动 ARM NEON 优化的软件(以及音频和视频编解码器)。文档表明,在 OpenCV3.0 中约有 40 个函数进行了这种处理。

如果为 LLVM 位代码编译,您将获得通用(优化程度较低,用 C 或 C++ 实现)版本。

位码的使用是可选的——除了为 Apple watch 编译时,很难想象你会运行计算复杂的图像处理。如果您要捆绑手表应用程序,请仅覆盖其上位码的构建设置。

于 2015-09-22T23:13:35.723 回答