2

ココアと Mac の開発は初めてです。私は、cocoa フレームワークを使用した Objective-C と C++ ライブラリ dylib で記述されたバックエンドを組み合わせたアプリケーションを作成しました。

私は xcode 4.6 を使用しており、上記の 2 つのプロジェクト Cocoa アプリと私の C++ ライブラリがあります。C++ も私自身のプロジェクトです。

いよいよ展開です。そのためのpkgインストーラーを作りたいです。C++プロジェクトの出力ディレクトリになるようにobject-cプロジェクト設定に検索ライブラリパスを追加したため、xcode 4.6で実行/デバッグできました。したがって、依存関係を見つけて、クラッシュすることなく実行できます。

xcode 内の Objective-C プロジェクト ツリーに、products -> mysoftware.app ファイルが表示されます。ファインダーでこの mysoftware.app ファイルの場所を見つけて実行すると、クラッシュします。このアプリ ファイルのパッケージ コンテンツを開くと、次の構造のコンテンツが表示されます

   contents\(info.plist, MacOS, pkginfo, resources )

そこに自分の C++ ライブラリが表示されません。mysoftware.app を直接ダブルクリックして実行すると、dylib が見つからないためクラッシュします。レポート ウィンドウにスタック トレースが表示されます。 local/lib/mylib.dylib また、実行可能ファイルがある MacOS 内の .app に dylib ファイルを手動で配置しました。同じディレクトリから lib が見つかることを期待していますが、そうではなく、上記と同じメッセージが表示され、探しています正しい場所 /usr/local/lib/mylib.dylib から

私の質問は、展開用の .app パッケージの依存関係をどのように解決するかです.dylib を .app パッケージ内に配置する必要がありますか? 次のステップは、この単一の .app を pkg インストーラーに入れることです。

ありがとう

4

2 に答える 2

2

これは私のために働いたものです:

  1. dylib をフレームワークにドラッグします。
  2. Copy Files ビルド フェーズを追加し、フレームワークを宛先にして、そこに dylib を配置します。
  3. 次のスクリプトを含む Run Script フェーズを追加します。

MYLIBNAME=libmylib.dylib
install_name_tool -change /usr/local/lib/$MYLIBNAME @executable_path/../Frameworks/$MYLIBNAME  "$BUILT_PRODUCTS_DIR/$EXECUTABLE_PATH"

それでおしまい。このスクリプトは、適切な場所から dylib をロードするようにアプリに指示します。そうしないと、実行時に dylib が見つからないというエラーが表示されます。

dylib 自体は何も変更する必要がないことに注意してください。他の場所から提供される可能性があります。

于 2014-04-19T15:46:11.787 に答える
0

私はそれを解決したので、同じことをしたい他の人を助けるためにこの答えを出しています. dylib は、アプリケーション バンドル内のサブ フォルダーの 1 つ (つまりmysoftware.app) に配置する必要があります。MacOSFrameworksまたはそれを配置することを決定したサブフォルダーである可能性があります。

最初のステップは、dylib のターゲット設定です。インストール パスをアプリ バンドル (mysoftware.app) からの相対パスに設定するため、lib の Xcode ターゲット設定で次のように設定します。

@executable_path/../frameworks  

も使用できます@rpath(それについて調査したい場合があります。それよりも柔軟性があると思います@executable_path

Xcode は、dylib のインストール名も変更します。

次に、プロジェクト設定で dylib を使用する Objective-C プロジェクトで -> ビルド フェーズ -> リンク -> dylib プロジェクトの製品ノードから dylib をここにドラッグします。

Objective-C/Cocoa プロジェクトの最後のステップは、copy files という名前のビルド ステップを追加することです。これにより、バンドルのターゲット フォルダーを示すコンボ ボックスが表示されます。フレームワークに設定します (これは、dylib のインストール パスを設定するときに選択した相対パスによって異なります)。「ファイルのコピー」ビルド ステップの 2 番目の部分は、コピーするソース ファイルを提供することです。これが、バンドルの Frameworks フォルダーにパックする dylib ファイルです。そのため、dylib ファイルを (dylib プロジェクトの) 製品からビルド ステップのソース ファイルにドラッグします。

以上です。

ここで、Objective-C または Cocoa プロジェクトをビルドするときに、ビルド手順とinstall_pathなどが正しく構成されていれば、正常にビルドされるはずです。Cocoa プロジェクトのビルドが成功したら、Products -> mysoftware.app -> Finder で Locate に移動し、実行すると正常に動作するはずです。依存関係の dylib はバンドルの Frameworks フォルダーにあり、正しくリンクされているためです。バンドルのパッケージ コンテンツを表示して、Frameworks フォルダーに dylib ファイルが含まれているかどうかを確認できます。

驚いたことに、dylib が格納されているパスは、dylib の一部である必要があります。したがって、プロジェクトがこの dylib にリンクすると、同じパス自体がコピーされます。したがって、その dylib にリンクされた Cocoa アプリを実行すると、dylib 内からコピーしたものとまったく同じパスが検索され、 dylib が存在する場所を伝える責任があります。install_pathなどの形で

Cocoa プロジェクトに保存されている dylib のインストール パスを、その dylib を使用して手動で更新するツールがあります。これらのツールを使用して既存のバンドルのパスを更新する場合は、dylib 自体では必要なく、dylib のクライアントで変更する必要があります。

コードがある場合は、上記の手順に従って Xcode で変更できます。

otool -L my.dylibたとえば、既存のバイナリ ライブラリの dylib インストール パスを確認するために使用できます。

install_name_tool -change既存のバイナリ lib のインストール パスを更新するために使用できます。

于 2013-07-09T13:05:06.757 に答える