依存ライブラリを含む Mac OS X を配布するにはどうすればよいですか?
-
18-09-2019 - |
質問
私にはプログラムがあります (具体的には、 SO DevDays カウントダウン アプリ チャレンジ) これは、libSDL、libSDL_ttf などのいくつかの動的ライブラリに依存します。これらのライブラリは以下にインストールされています /opt/local/lib
MacPorts 経由で、多くの人はこれらをインストールしていません (また、インストールしている人もいるかもしれませんが、その場所にはインストールされていません)。
これらのライブラリがインストールされていない人でもすぐに実行できるようにプログラムを配布するにはどうすればよいですか?もちろん、さまざまなものを配布する必要があります .dylib
ファイルを作成しますが、これだけでは不十分です。ダイナミック ローダーは引き続き、ライブラリがインストールされている場所にインストールされているライブラリを検索します。Windows が DLL で行うことと同様に、動的ローダーに実行可能ファイルの現在のディレクトリを参照するように指示する方法はありますか?環境変数を変更する必要はありません (例: DYLD_LIBRARY_PATH
)、やはりこれがすぐに機能するようにしたいのです。
解決
あなたが言ったように、Xcodeを使用していないので、少し難しいです。私の好みの順にオプションを示します。
Xcode に切り替えます。フレームワークを使用します。SDL ライブラリはすでにフレームワークとして利用可能であり、アプリ バンドル内に libsdl.framework を含む商用ゲームをいくつか見てきました。
フレームワークを使用しますが、Makefile は保持してください。SDL ライブラリのフレームワーク バージョンをダウンロードし (または自分で構築し)、-framework リンカー フラグを使用してリンクします。フレームワークをアプリと一緒に配布するかどうかを決定し、~/Library/Frameworks または /Library/Frameworks のいずれかにフレームワークを配置するようにユーザーに指示します。このためにインストーラーを使う必要はありません。
SDL に対して静的にリンクします。Makefile では、-l フラグを使用するのではなく、静的ライブラリのパスをリストする必要があります。たとえば、「ld 何とか /opt/local/lib/libsdl.a」を実行します。-l に共有ライブラリよりも静的ライブラリを優先するように指示する方法はありません。信じてください、私は調べました。
他のヒント
これに対する基本的なアプローチは、.app バンドルで配布することです。次に、リンカーが共有ライブラリを検索する場所を変更して、これを含めます。
手順は次のとおりです。
ターゲットへの新しいコピー ファイル ビルド フェーズを作成し、それらのファイルを .app バンドルの Frameworks ディレクトリにコピーします。
ビルド構成設定「Runpath Search Paths」を編集して含めます。
@executable_path/../Frameworks
これらの変更を加えて実行可能ファイルをビルドして確認すると、dylib が Foo.app/Contents/Framework
ディレクトリと実行中 otool -L Foo.app/Contents/MacOS/Foo
これらの dylib の場合は、yield と @rpath をプレフィックスとして付けたエントリを指定する必要があります。
これから ココアビルダーの投稿:
一般的に、 @loader_path
よりも優先されます @executable_path
, 、そのまま
組み込みフレームワークが実行可能ファイルとバンドルの両方で動作できるようにします。
プラグイン、またはサブフレームワーク。唯一の欠点はそれです @loader_path
10.4 以降が必要です。10.5 以降を使用している場合は、 @rpath
均等です
より良い @loader_path
.
静的ライブラリをリンクます。