15

動的ライブラリとしてコンパイルしているプロジェクトのコレクションがあります。これらの .dylib のそれぞれは、他のさまざまなディレクトリ (実行可能パスにあるもの、ローダー パスにあるもの、固定パスにあるもの) に配置したい他のさまざまな .dylib に依存しています。

コンパイルされたライブラリで実行するotool -Lと、それらの依存関係へのパスのリストが表示されますが、それらのパスがどのように設定/決定されているかはわかっています。それらはほとんど疑似ランダムに見えます。これらのパス(@rpath、@executable_path、@loader_pathなど)を変更しようとするために、Xcodeの「ビルド設定」をいじって何時間も費やしましたが、何も変更できないようです(実行で確認otool -L) . これらのフラグをどこに追加すればよいか完全にはわかりません。また、次のフラグの違いや適切な使用方法もよくわかりません。

リンク - 「動的ライブラリ インストール名」
リンク - 「実行パス検索パス」
リンク - 「その他のリンク フラグ」
検索パス - 「ライブラリ検索パス」

さまざまなライブラリで実行するinstall_name_tool -changeと、実行パスの検索パスを正常に変更できます (実行otool -Lして確認したとおり)。

私は Xcode 4.2 を実行していますが、ほとんどあきらめて、install_tool_name を実行するビルド後のスクリプトを使用して変更を加えています。しかし、それはクラッジハックの修正であり、私はそれをしたくない.

dylib 依存関係の検索/実行パスがどのように設定されているかはどこで確認できますか?
私が間違っているかもしれないことについて誰にもアイデアがありますか?

4

2 に答える 2

14

通常、私のdylibのターゲットでは、INSTALL_PATH別名「インストールディレクトリ」を必要なプレフィックスに設定します(例:@executable_path/../Frameworks)。

LD_DYLIB_INSTALL_NAME別名「動的ライブラリのインストール名」をデフォルト値に設定したままにします$(DYLIB_INSTALL_NAME_BASE:standardizepath)/$(EXECUTABLE_PATH)

Xcode は、ターゲットの名前に基づいてそれを展開するため@executable_path/../Frameworks/MyFramework.framework/Versions/A/MyFramework、たとえば .

重要なことは、ビルド プロセスの一部として、インストール パスが dylib に組み込まれていることです。後で、A.dylib を参照する B.dylib をリンクすると、A.dylib のインストール パスがB.dylib にコピーされます。(これotoolが表示されているものです -- コピーされたインストール パスです。) したがって、最初に dylib に組み込まれた正しいインストール パスを取得するのが最善です。

すべての dylib を連携させる前に、それぞれを個別に確認してください。それをビルドしてから、ビルドotool -Lされたdylibで。各アーキテクチャの最初の行は、LD_DYLIB_INSTALL_NAME表示されていたものです。

整理したら、dylib を相互にリンクさせてみてください。それははるかに簡単なはずです。

于 2012-03-21T05:21:49.920 に答える