ビルド済みのdylibをアプリケーションに埋め込む

5月の休日が始まる前に、コンテストのためにiOSとMac用のアプリケーションを書くのに忙しい5日間を費やしました。 開発は体系的に進められていましたが、アプリケーションが最終的に私を満足させ始めました。 私は新鮮な心でこれを行うために、最後の日の朝まで出発を延期することにしました(まだテキストの説明が添付されていなければなりませんでした)。 電車が休暇に入る数時間前の朝、私は座って落ち着いて主な機能の最後の慣らしをしました。 そして、開発されていない完全に異なるマシンでアプリケーションがどのように動作するかをテストすることは良いアイデアのように思えました。 アプリケーションをアーカイブし、別のMacに転送します... ...起動しません。 「画像が見つかりません」という非常に有益なエラーが発生し、dylibの問題を明示的に示します。 だから:電車に3時間、未知の理由でアプリケーションが起動しません。 なぜこれが起こったのか、どのようにこれを回避できたのか、そして私はこの問題にどのように対処したのか-カットの下のすべてについて。







私は問題の本質を非常に迅速に理解しましたが、その解決には時間がかかりました。 何が起こったかを把握しましょう。 私のアプリケーションはOpenCVを使用しました。 CMakeを使用して、公式サイトから直接デフォルト構成で元のソートから収集しました。 その後、彼はXcodeでの検索パスのペアを指摘し、開発がシームレスに進むと述べました。 おそらく既に理解しているように、問題は、作業中のマシンで、アプリケーションがアドレス/usr/local/lib/



あるライブラリを使用していたことです。







このパスはXcodeでの検索用に指定されたため、 それらをアプリケーションにリンクしましたが、アーカイブ中に必要なすべてのライブラリが追いつくと誤って考えましたが、今ではそうではないことがすでにわかっています。 私に最初に思い付いたのは、インストーラーを作成することです。 原則として、これは実用的なソリューションであり、多くの人がまさにそれを行っています。 ただし、この時間はありませんでした。 インストーラー自体の開発に時間を費やすことに加えて、テストなども必要でした。列車は数時間後に出発しました。







私はこの問題をグーグルで調べ始め、dylibをアプリケーション自体にドロップする必要があることに気付きました。 考え直すことなく、私はそれらをXcodeプロジェクトに投入し、リンケージを追加し、アーカイブしました...動作中のマシンでも、サードパーティでも、すべて同じ問題です。 問題は、dylibの有線インストールと依存関係検索パスにありました。 私の場合は怪物だった







 /Users/s1ddok/Downloads/opencv-3.1.0/build/lib/libopencv_core.3.1.dylib
      
      





これは、ビルドフォルダーから中間dylibをプロジェクトに追加したためです。これらは、後でmake install



コマンドによってmake install



されるものですが、 /usr/local/lib/



からそれらを取得しても、問題は解決しませんでした。







この問題をどのように回避できますか? dylibのコンパイル中に必要なインストールパスをすぐに示します。 ライブラリをコンパイルする場合、おそらくすべてが正しくインストールされています。そうでない場合は、Xcodeで簡単に実行できます。 具体的には、OpenCVの場合、デフォルトのCMake構成を変更し、そこにインストールディレクトリのプレフィックスを追加することだけが必要でしたが、その時点ではこれを行う機会がありませんでした。







そのため、既製のdylibのインストールパスを何らかの方法で変更して、それらを開始する必要がありました。 結果に至るまでの詳細な説明は省略し、最終的に何が機能したかのみを説明します。







まず、プロジェクトに追加したdylibが、アプリケーションとともにバンドルにコピーされる必要があります。 原則として、メインバンドルに配置できる場所はすべて同じですが、Frameworksフォルダーにコピーするのは論理的です。 これを行うには、Xcode->ターゲット設定->ビルドフェーズに移動し、新しいファイルコピーフェーズを追加します。 私のアプリケーションはOpenCVスイートの2つのライブラリのみを使用しているため、私にとっては次のようになります。







画像







必要なdylibはすべてアプリケーション内に保存されましたが、それらへのパスはまだ古いため、同じエラーで失敗します。 otool



install_name_tool



などのユーティリティが役立ちます。 1つ目は、どのインストールパスが既存のライブラリに「配線」されているかを調べるために必要であり、2つ目は、それらを変更するために必要でした。 Xcodeに新しいビルドフェーズ、今回はRun Script



を追加しRun Script



。 スクリプト自体は次のようになりました。







 #         install_name_tool -change lib/libopencv_core.3.1.dylib @executable_path/../Frameworks/libopencv_core.3.1.0.dylib $BUILT_PRODUCTS_DIR/$EXECUTABLE_PATH install_name_tool -change lib/libopencv_imgproc.3.1.dylib @executable_path/../Frameworks/libopencv_imgproc.3.1.0.dylib $BUILT_PRODUCTS_DIR/$EXECUTABLE_PATH #    Frameworks    cd $BUILT_PRODUCTS_DIR cd MyApp.app cd Contents cd Frameworks #        install_name_tool -id @executable_path/../Frameworks/libopencv_core.3.1.0.dylib libopencv_core.3.1.0.dylib install_name_tool -id @executable_path/../Frameworks/libopencv_imgproc.3.1.0.dylib libopencv_imgproc.3.1.0.dylib #    ,  ,     . # otool -L libopencv_imgproc.3.1.0.dylib #       opencv-core     ,    install_name_tool -change /Users/s1ddok/Downloads/opencv-3.1.0/build/lib/libopencv_core.3.1.dylib @executable_path/../Frameworks/libopencv_core.3.1.0.dylib libopencv_imgproc.3.1.0.dylib
      
      





もちろん、これは恐ろしい決定であり、スクリプトは各ライブラリごとにやり直す必要がありますが、普遍的ではありません。 当時、一般的なソリューションを開発する時間はありませんでした。







私の経験が誰かに役立つことを願っています。非常に神経質でストレスの多い環境でこれらすべてに対処したので、アプリケーションが起動し、正常に送信できたことを二重に嬉しく思います。ささいなこと。








All Articles