2009-09-27 12 views
13

私はいくつかの動的ライブラリ、つまりlibSDL、libSDL_ttfなどに依存するプログラム(具体的にはSO DevDays Countdown app challengeのエントリ)を持っています。私はこれらのライブラリをMacPorts経由で/opt/local/libの下にインストールしています。これらのライブラリはインストールされていない(インストールされているかもしれませんが、その場所にはありません)。依存ライブラリを使用してMac OS Xを配布するにはどうすればいいですか?

これらのライブラリがインストールされていない人でもすぐに使用できるようにプログラムを配布するにはどうすればよいですか?明らかに私は様々なファイルを配布する必要がありますが、これは不十分です。ダイナミックローダーはまだ私がインストールした場所にインストールされているライブラリを探します。ダイナミックローダーに実行可能ファイルのカレントディレクトリを見てもらう方法はありますか?やはり、この環境変数を変更する必要はありません(例:DYLD_LIBRARY_PATH)。

答えて

5

あなたがXcodeを使用していないと述べたので、少し難しいです。ここに私の好みのオプションがあります:

  1. Xcodeに切り替えてください。フレームワークを使用する。 SDLライブラリは既にフレームワークとして利用可能です。アプリバンドルの中にlibsdl.frameworkを持つ商用ゲームを2つ以上見てきました。

  2. フレームワークを使用しますが、Makeファイルは保管してください。 SDLライブラリのフレームワークバージョンをダウンロード(または自分でビルド)し、-frameworkリンカフラグを付けてリンクします。アプリケーションでフレームワークを配布するかしないかを決め、〜/ Library/Frameworksまたは/ Library/Frameworksに入れてください。私はこれのためのインストーラを気にしません。

  3. SDLと静的にリンクします。 Makefileでは、 "ld blah blah /opt/local/lib/libsdl.a"を実行するなど、-lフラグを使用するのではなく、静的ライブラリのパスをリストアップする必要があります。共有ライブラリの静的な方を好むように-lに伝える方法はありません。私は信じています。

+0

それについて考えると、私は静的リンクを使って配布するつもりだと思います。とにかくダイナミックライブラリを配布しようとすると、それらのライブラリを使用する目的がいくつか失われるため、ダイナミックローダを扱う際の苦労を避けることもできます。 –

+1

4.オプション2.を使用して、.appバンドル(.dmgファイル)内にフレームワークを置き、install_name_toolを使用して実行可能ファイルのパスを変更します。 install_name_toolの使用例をいくつか示します:http://qt-project.org/doc/qt-4.8/deployment-mac.html。ディートリッヒ、これをあなたの答えに組み入れることができますか? –

+0

@MilanBabuškov:これは、以下の回答に既に組み込まれているようです。私は情報を複製する必要はないと思う。 –

3

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

+0

コードを再利用するほどです。 –

+6

静的にリンクされたライブラリは、コードを再利用するとカウントされます。これは、ライブラリコードがいくつのアプリケーションで使用されても、書き込み/テスト/デバッグが一度しか行われないためです。コンパイルされたコードの複数のコピーがユーザーのディスク上に残ることは事実ですが、これまでのハードドライブはそれほど大きな問題ではありませんでした。 –

13

基本的なアプローチは、.appのバンドルに同梱されていることです。次に、リンカーが共有ライブラリを探す場所を変更します。

手順は次のとおりです。

  1. は、新しいコピーファイルを作成しているの.appバンドルのフレームワークディレクトリにコピーし、それらのファイルをターゲットに位相を構築します。あなたはdylibsがFoo.app/Contents/Frameworkディレクトリやランニングに存在することを見つける必要があり

  2. 編集して、これらの変更を使用して実行可能ファイルを構築し、見れば@executable_path/../Frameworks

を含めるように「実行パス検索パス」を設定するビルド構成、 otool -L Foo.app/Contents/MacOS/Fooは、それらのdylibのために@rpathの接頭辞を付けて入力する必要があります。このCocoabuilder postから

:それ
、埋め込みフレームワークは、実行可能ファイルとバンドルの両方で
プラグイン、またはサブフレームワークを動作することを可能にするように一般に

は、@loader_pathは、@executable_pathより好ましいです。唯一の欠点は、@loader_path
が10.4以上であることです。 10.5以上であれば、@rpath
でも@loader_pathより優れています。

+0

私はXcode(.appバンドルはありません)、普通の古いgccとmakeを使用していません。私はOS X 10.4も使用しています。 http://developer.apple.com/mac/library/documentation/DeveloperTools/Conceptual/DynamicLibraries/100-Articles/RunpathDependentLibraries.htmlによると、実行パス検索パスは10.5以降でのみサポートされています。 –

+1

私は@executable_pathが10.4でも動作すると信じています(@loader_pathと@rpathはそうではありません)。 http://blog.onesadcookie.com/2008/01/installname-magic.html – nall

+0

Xcodeを使用していない場合は、Autotoolsや友だちを使用することをお勧めします。 –

関連する問題