3

Xcode と Mac 環境は初めてです。ブースト、Clucene などのいくつかの動的および静的ライブラリを使用しています。すべてのライブラリが下にあります。

MyApp.app/Contents/Resources

このパスをアプリの dyld_library_path として設定したいと考えています。XXX.plistファイルを次のように編集してみました

DYLD_LIBRARY_PATH /マイパス/xxx

Xcodeで環境変数と引数を設定しても何も機能しません。

しかし、.dmgでアプリをダブルクリックせずに以下のようなシェルスクリプトを実行すると動作します

#!/bin/bash
clear
cd /Volumes/xxx/myapp.app/Contents/MacOS
export DYLD_LIBRARY_PATH="/Volumes/xxx/myapp.app/Contents/Resources"
./myapp

これはこれを行う適切な方法ではないと確信しています。アプリを実行するたびに dyld_library_path を設定する適切な方法はありますか?

編集:すべてのライブラリを手動でクライアントの/ usr/libパスにコピーしても機能します...これも適切な方法ではないと思います。

4

1 に答える 1

13

設定DYLD_LIBRARY_PATHは、この問題を解決する最良の方法ではありません。dyldライブラリの場所について誤った情報を伝えているという事実を回避しています。

実行otool -L MyApp.app/Contents/MacOS/MyAppすると、MyApp が読み込みたいライブラリへのパスが表示されます。指定されたパスにライブラリが見つからない場合、 は でdyld指定された場所でライブラリを探しますDYLD_FALLBACK_LIBRARY_PATH。設定DYLD_LIBRARY_PATHにより、上記のコマンドが返しdyldたパスの前の指定された場所でライブラリが検索されます。otool

この問題を解決する最善の方法は、設定DYLD_LIBRARY_PATHが不要になるように、開始するライブラリの正しい場所をアプリケーションに指定させることです。これを行うには、次のことを行う必要があります。

  1. アプリケーション内にバンドルする各ライブラリのライブラリ識別子を@rpath-relative 値に設定します。を使用してこれを行うことができますinstall_name_tool -id @rpath/libFoo.dylib libFoo.dylib
  2. Copy Files ビルド フェーズを追加して、ライブラリをアプリケーション ラッパーにコピーします。MyApp.app/Contents/Frameworks典型的な場所です。MyApp.app/Contents/Resourcesバイナリは通常の意味でのリソースではないため、避ける必要があります。
  3. アプリケーションをリンクするときに、実行パスの検索パスを指定します。これにより、ロード コマンドで検出された変数を解決するために使用するパスのリストがリンカーに提供さ@rpathれます。ライブラリを にコピーする場合はMyApp.app/Contents/Frameworks、実行パスの検索パスを@loader_path/../Frameworks. LD_RUNPATH_SEARCH_PATHSこれは、アプリケーション ターゲットの Xcode の (Runpath Search Paths) 構成設定を介して行うことができます。

otoolこれをすべて行った後、上記のコマンドを再実行して、ライブラリへのパスが@rpath-relative パスを使用していることを確認できるはずです。その後、値 で指定されたロード コマンドを実行otool -lV MyApp.app/Contents/MacOS/MyAppして確認できるはずです。最後に、アプリケーションを実行すると、設定せずに Frameworks ディレクトリ内でライブラリが検出されることがわかります。LC_RPATH@loader_path/../FrameworksDYLD_LIBRARY_PATH

于 2013-02-27T07:51:10.313 に答える