如何使用ENABLE_BITCODE编译OpenCV iOS

19

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

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

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

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

有些参考资料指出了一种临时解决方案,可以禁用ENABLE_BITCODE,以便在没有Bitcode的情况下进行链接。这将防止应用程序为Apple Watch编译,因为Watch应用程序必须使用Bitcode。因此,我的问题是,有没有一些(最好是简单易行的)方法来启用Bitcode编译iOS OpenCV?(最好附带已编译框架的下载链接)

2个回答

22

经过一番搜索和尝试,我找到了一种可以从源代码编译OpenCV iOS并启用Bitcode的方法。这里也提供了一个已编译好的二进制文件:[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选项:编辑 ~/<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项目中。

P.S. 根据这篇文章上的建议,即使您已经知道答案,也鼓励提出问题。


2
我发现OpenCV的新版本(版本3.1)在build_framwork.py文件中已经有了-fembed-bitcode标志。 - CSawy
@CSstudent 谢谢你提醒我! - grapeot
@grapeot 我按照相同的步骤操作,但在第四步遇到了问题。请帮帮我。我可以向您展示日志,但它们超出了字符限制,无法在此处发布。 - Himanshu Garg
@grapeot 请参考以下链接。我在这里附上了一张截图。 http://stackoverflow.com/q/41465600/3572586 - Himanshu Garg
似乎无法与Python 3一起使用,我不得不执行python2.7 opencv/platforms/ios/build_framework.py ios - Guig

8

OpenCV是一种可能会有手动优化ARM NEON的软件(连同音频和视频编解码器)。文档表明,在OpenCV 3.0中,大约有40个函数经过了这样的处理。

如果编译为LLVM位代码,则将获得通用版本(不太优化,使用C或C++实现)。

使用位代码是可选的 - 除非编译Apple Watch时,因为难以想象你会运行计算密集型图像处理。如果您正在打包手表应用程序,请仅覆盖位代码的构建设置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接