16

libSDL、libSDL_ttf などのいくつかの動的ライブラリに依存するプログラム (具体的には、SO DevDays カウントダウン アプリ チャレンジへのエントリ) があります。私はこれらのライブラリ/opt/local/libを MacPorts 経由でインストールしましたが、多くの人はこれらをインストールしていません (インストールしていても、その場所にインストールしていない人もいます)。

これらのライブラリをインストールしていない人がすぐに実行できるように、プログラムを配布するにはどうすればよいですか? もちろん、さまざまなファイルを配布する必要がありますが.dylib、これだけでは不十分です。動的ローダーは、私がインストールした場所にインストールされているライブラリを探します。Windows が DLL で行うように、動的ローダーに実行可能ファイルの現在のディレクトリを調べるように指示する方法はありますか? 環境変数 (例: DYLD_LIBRARY_PATH) を変更する必要はありません。これも、すぐに使えるようにしたいからです。

4

3 に答える 3

13

これに対する基本的なアプローチは、それらを .app バンドルで出荷することです。次に、リンカーが共有ライブラリを探す場所を変更して、これを含めます。

手順は次のとおりです。

  1. これらのファイルを .app バンドルの Frameworks ディレクトリにコピーする新しいコピー ファイル ビルド フェーズをターゲットに作成します。

  2. ビルド構成設定「Runpath Search Paths」を編集して含める@executable_path/../Frameworks

Foo.app/Contents/Frameworkこれらの変更を加えて実行可能ファイルをビルドして確認すると、ディレクトリに dylib が存在し、実行otool -L Foo.app/Contents/MacOS/Fooすると、それらの dylib の @rpath で始まるエントリが生成されます。

このCocoabuilder の投稿から:

一般に、 組み込みフレームワークを実行可能ファイルとバンドル、 プラグイン、またはサブフレームワークの両方で動作させることができるため、より@loader_pathも が好まれます。唯一の欠点は、 10.4 以降が必要なことです。10.5 以降を使用している場合は 、.@executable_path

@loader_path
@rpath
@loader_path

于 2009-09-27T03:40:46.860 に答える
6

おっしゃる通り、Xcodeを使っていないのでちょっと難しいです。好みの順序でオプションを次に示します。

  1. Xcode に切り替えます。フレームワークを使用します。SDL ライブラリは既にフレームワークとして利用できます。アプリ バンドル内に libsdl.framework を含む商用ゲームを 2 つ以上見てきました。

  2. フレームワークを使用しますが、Makefile は保持してください。SDL ライブラリのフレームワーク バージョンをダウンロード (または自分でビルド) し、-framework リンカー フラグを使用してリンクします。アプリと一緒にフレームワークを配布するか配布しないかを指定し、ユーザーにそれらを ~/Library/Frameworks または /Library/Frameworks に配置するように指示します。このためのインストーラーは気にしません。

  3. SDL に対して静的にリンクします。Makefile では、-l フラグを使用するのではなく、静的ライブラリのパスをリストする必要があります。たとえば、「ld blah blah /opt/local/lib/libsdl.a」を実行します。-l に共有ライブラリよりも static を優先するように指示する方法はありません。私を信じてください。

于 2009-09-27T04:10:08.770 に答える
3

ライブラリを静的にリンクします。

于 2009-09-27T03:17:06.313 に答える