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 を使用してください)

とリンクを拒否しました。グーグルで調べた結果、Apple が App Store 内でアプリを最適化するために Bitcode という名前の新しい機能を追加したことが原因であることが判明しました。OpenCV iOS バイナリは Bitcode を含むように更新されていませんが、リンク ステージを通過できません。

ビットコードなしでリンクを実行できるように、無効にする一時的な解決策を指摘した参考文献もあります。ENABLE_BITCODEWatch アプリにはビットコードが必須であるため、これによりアプリが Apple Watch 用にコンパイルされなくなります。したがって、私の質問は、ビットコードを有効にして iOS OpenCV をコンパイルする (最も簡単な) 方法はありますか? (コンパイルされたフレームワークのダウンロードリンクを使用するとより良い)

4

2 に答える 2

21

いくつかの検索と試行の後、Bitcode を使用してソースから OpenCV iOS をコンパイルする方法を見つけました。コンパイルされたバイナリもここで提供されます: [v3.0] [v2.4]。[免責事項: コンパイルされたバイナリの完全性については責任を負いません。自己責任。]

コンパイルの手順は基本的に公式ドキュメントと同じですが、1 つの手順だけが追加されています。

  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++ で実装された) バージョンが得られます。

Bitcode の使用はオプションです。Apple Watch 用にコンパイルする場合を除きます。計算的に複雑な画像処理を実行するとは考えにくい場合です。Watch アプリをバンドルしている場合は、ビットコードのビルド設定のみをオーバーライドします。

于 2015-09-22T23:13:35.723 に答える