如何用 ENABLE_BITCODE 编译 OpenCV iOS
How to compile OpenCV iOS with ENABLE_BITCODE
当我尝试使用 XCode 7 + iOS SDK 9 使用 OpenCV 2.4 iOS 编译我的 XCode 项目时,XCode 抱怨说
ld:
'opencv2.framework/opencv2(alloc.o)'
does not contain bitcode. You must rebuild it with bitcode enabled
(Xcode setting ENABLE_BITCODE), obtain an updated library from the
vendor, or disable bitcode for this target. for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see
invocation)
并拒绝link。经过一番谷歌搜索后,turns out 是因为 Apple 在 App Store 中添加了一项名为 Bitcode 的新功能,用于优化应用程序。虽然 OpenCV iOS 二进制文件尚未更新为包含 Bitcode,但它无法通过 link 阶段。
一些 指出了禁用 ENABLE_BITCODE
的临时解决方案,因此 linking 可以在没有 Bitcode 的情况下完成。这将阻止为 Apple Watch 编译该应用程序,因为 Bitcode 对 Watch 应用程序是强制性的。因此我的问题是,是否有一些(最简单的)方法可以在启用 Bitcode 的情况下编译 iOS OpenCV? (编译框架最好下载 link)
经过一些搜索和尝试,我找到了一种使用 Bitcode 从源代码编译 OpenCV iOS 的方法。此处还提供了已编译的二进制文件:[v3.0] [v2.4]。 [免责声明:我不对已编译二进制文件的完整性负责。使用风险自负。]
编译步骤与official document基本相同,只是多了一步
用git下载代码:
cd ~/<my_working_directory>
git clone https://github.com/Itseez/opencv.git
为 Xcode 制作符号 link 让 OpenCV 构建脚本找到编译器、头文件等
cd /
sudo ln -s /Applications/Xcode.app/Contents/Developer Developer
[关键步骤] 更改编译脚本以添加 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\" " +
改变后。
构建 OpenCV 框架:
cd ~/<my_working_directory>
python opencv/platforms/ios/build_framework.py ios
如果一切正常,几分钟后你会得到~/<my_working_directory>/ios/opencv2.framework
。您可以将此框架添加到您的 Xcode 项目中。
P.S。根据 Meta Stackchange 上的 this post,鼓励您提出问题,即使您已经知道答案也是如此。
OpenCV 恰恰是一种可能具有手动 ARM NEON 优化的软件(以及音频和视频编解码器)。 documentation 表明大约 40 个函数在 OpenCV3.0 中进行了这种处理。
如果针对 LLVM 位代码进行编译,您将获得通用(优化程度较低,以 C 或 C++ 实现)版本。
Bitcode 的使用是可选的 - 除了为 Apple Watch 编译时,很难想象您无论如何都会 运行 计算复杂的图像处理。如果您要捆绑手表应用程序,请仅覆盖其上的位码构建设置。
当我尝试使用 XCode 7 + iOS SDK 9 使用 OpenCV 2.4 iOS 编译我的 XCode 项目时,XCode 抱怨说
ld: 'opencv2.framework/opencv2(alloc.o)' does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), obtain an updated library from the vendor, or disable bitcode for this target. for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
并拒绝link。经过一番谷歌搜索后,turns out 是因为 Apple 在 App Store 中添加了一项名为 Bitcode 的新功能,用于优化应用程序。虽然 OpenCV iOS 二进制文件尚未更新为包含 Bitcode,但它无法通过 link 阶段。
一些 ENABLE_BITCODE
的临时解决方案,因此 linking 可以在没有 Bitcode 的情况下完成。这将阻止为 Apple Watch 编译该应用程序,因为 Bitcode 对 Watch 应用程序是强制性的。因此我的问题是,是否有一些(最简单的)方法可以在启用 Bitcode 的情况下编译 iOS OpenCV? (编译框架最好下载 link)
经过一些搜索和尝试,我找到了一种使用 Bitcode 从源代码编译 OpenCV iOS 的方法。此处还提供了已编译的二进制文件:[v3.0] [v2.4]。 [免责声明:我不对已编译二进制文件的完整性负责。使用风险自负。]
编译步骤与official document基本相同,只是多了一步
用git下载代码:
cd ~/<my_working_directory>
git clone https://github.com/Itseez/opencv.git
为 Xcode 制作符号 link 让 OpenCV 构建脚本找到编译器、头文件等
cd /
sudo ln -s /Applications/Xcode.app/Contents/Developer Developer
[关键步骤] 更改编译脚本以添加 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\" " +
改变后。
构建 OpenCV 框架:
cd ~/<my_working_directory>
python opencv/platforms/ios/build_framework.py ios
如果一切正常,几分钟后你会得到
~/<my_working_directory>/ios/opencv2.framework
。您可以将此框架添加到您的 Xcode 项目中。
P.S。根据 Meta Stackchange 上的 this post,鼓励您提出问题,即使您已经知道答案也是如此。
OpenCV 恰恰是一种可能具有手动 ARM NEON 优化的软件(以及音频和视频编解码器)。 documentation 表明大约 40 个函数在 OpenCV3.0 中进行了这种处理。
如果针对 LLVM 位代码进行编译,您将获得通用(优化程度较低,以 C 或 C++ 实现)版本。
Bitcode 的使用是可选的 - 除了为 Apple Watch 编译时,很难想象您无论如何都会 运行 计算复杂的图像处理。如果您要捆绑手表应用程序,请仅覆盖其上的位码构建设置。