【问题标题】:How to compile OpenCV iOS with ENABLE_BITCODE如何使用 ENABLE_BITCODE 编译 OpenCV iOS
【发布时间】:2015-09-22 07:05:08
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: ios xcode opencv bitcode


    【解决方案1】:

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

    编译步骤与official document基本相同,只是多了一个步骤。

    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 的额外选项:编辑 ~/<my_working_directory>/opencv/platform/ios/build_framework.py,并找到包含 -DCMAKE_C_FLAGS 的行。添加-fembed-bitcode 的标志。例如,在我得到的源代码中,它是第 55 行,看起来像

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

      改变之后。 [ref]

    4. 构建 OpenCV 框架:

      cd ~/<my_working_directory>

      python opencv/platforms/ios/build_framework.py ios

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

    附:根据 Meta Stackchange 上的 this post 鼓励您提出问题,即使您已经知道答案。

    【讨论】:

    • 发现新版opencv(3.1版)的build_framwork.py文件中已经有了-fembed-bitcode标志
    • @CSstudent 感谢您的提醒!
    • @grapeot 我遵循了相同的步骤,但面临与第 4 步相同的问题。请帮助我。我可以给你看日志,但它们超出了字符数限制。所以不能在这里发帖。
    • @grapeot 请参考以下链接。我在这里附上了一个截图。 stackoverflow.com/q/41465600/3572586
    • 它似乎不适用于 python 3,我必须这样做 python2.7 opencv/platforms/ios/build_framework.py ios
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-06-12
      • 2016-09-01
      • 2017-05-22
      • 1970-01-01
      • 2014-06-03
      • 2020-07-31
      • 1970-01-01
      • 1970-01-01
      • 2017-04-13
      相关资源
      最近更新 更多