問題タブ [rpath]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 動的ライブラリが絶対パスとしてリンカーに渡され、相対パスによってロードされますか?
私が取り組んでいるプロジェクトをビルドして実行しようとしています。私は先に進んで構築し、すべてが素晴らしく、いかなる種類のエラーもありません. 次に、実行可能ファイルを実行しようとすると、動的ライブラリの依存関係の一部が見つからないというエラー メッセージが表示されます。
面白い。何をotool -l
報告しますか?
何を与える?CMake によって出力されるように、私のビルド呼び出しは (いくつかのクリーンアップの後) です。
コンパイル (読みやすくするための改行)
リンク:
私が知る限り、 と の両方libprotobuf.dylib
がlibgpr.dylib
リンク段階で絶対パスとして渡されています。libprotobuf.dylib
ではなく、絶対パスでロードされるのはなぜですかlibgpr.dylib
?
価値があるのは、設定DYLD_LIBRARY_PATH
することで機能しますが、設定したりエクスポートしたりする必要はありません。すべての依存関係を構築し、それらを特定のディレクトリに配置するようにレポを設定しました。これは、単に複製して構築する必要があります。
私のコンパイラのバージョンは次のとおりです。
c++ - 外部プロジェクトの RPATH を設定しますか?
簡単に開発できるように、リポジトリがすべての依存関係を git サブモジュールとしてインポートするプロジェクトをセットアップしようとしています。私の同僚は、レポ、、およびを複製するだけでgit submodule update --init --recursive
、cmake .
完全make
に機能する開発環境を整えることができます。CMakeLists.txt
ディレクトリ構造は、 を使用してすべてのサブモジュールをビルドするトップレベルのスーパービルドとしてセットアップさExternalProject_Add
れ、次の構造になります。
は次のCMakeLists.txt
ようになります。
ビルドプロセスはうまく機能します。私make
は最上位で、依存関係が にインストールされusr
、 にインストールcd
されmy_project
、作業を行い、ビルドされたすべての共有ライブラリが検出され、リンクされました。満足しています。
ただし、OS X でビルドされた実行可能ファイルを実行しようとすると、ディレクトリmy_project
に配置された動的ライブラリが見つからないことがわかります。usr/lib
CMake は、プロジェクト ディレクトリ内にビルドされRPATH
たfor ライブラリのみを設定しているようです。この場合は.my_project
カスタム インストールの場所をRPATH
ビルド時のライブラリと実行可能ファイルに追加する方法はありますか?
いくつかのメモ:
- この問題は OS X にのみ影響するようです。Linux ではこれらの問題はまったく発生しません。
DYLD_LIBRARY_PATH
カスタム インストールの場所を含めるように設定すると機能します。ただし、これによりセットアップに追加の手順が追加され、インストールの問題をデバッグしようとすると煩わしくなります。- を設定する
DYLD_FALLBACK_LIBRARY_PATH
こともできますが、追加のセットも追加されるため、これも良いオプションではありません。自作ユーザーはこのオプションを好まないでしょう。
linux - RPATH で $ORIGIN を指定するために推奨される GNU リンカ オプションは何ですか?
私のプラットフォームは、GNU ビルド ツールチェーン (GCC など) を使用するバニラ (非組み込み) x86-64 Linux であると仮定します。
で指定する$ORIGIN
にはRPATH
、リンカー オプションについて知っています-Wl,-rpath,'\$\$ORIGIN'
。
今日、別のオプションを発見しました: -Wl,-z,origin
.
を使用するときは常に含める必要がありますか?-Wl,-z,origin
-Wl,-rpath,'\$\$ORIGIN'
公式の GNU ld docs、言う:
オブジェクトに $ORIGIN が含まれている可能性があることを示します。
c++ - MAC の動的ライブラリ ディレクトリとの不一致
プロジェクトに動的ライブラリを含めようとしており、次の CMake スクリプトを使用してコンパイルを設定しています。
変数 ${dlib_LIBRARIES} のディレクトリを出力すると、次のようになります。
これは正しく、コンパイルされます。実行可能ファイルの実行時に問題が発生し、次のランタイム エラーが発生します。
otool -L 実行可能ファイルを実行すると、絶対パスではなく相対パスが取得されるため、これは論理的に思えます。
otool で表示されるパスが target_link_libraries で追加されたパスと同じでないのはなぜですか? cmake でこの問題を解決するにはどうすればよいですか?
python - OSX 上の Anaconda 用 QScintilla2 のインストール: @rpath の問題
多くの血と汗と涙を流して、Anaconda Python Distribution (2.5.0; Python 2.7.11; PyQt4) で使用するために QScintilla2 ( https://www.riverbankcomputing.com/software/qscintilla/download ) をコンパイルすることができました。 ) Mac OS X El Capitan で。
エラーや警告なしで Qt4Qt5 および Python フォルダー内のすべてをコンパイルおよびインストールした後、すべてが Anaconda の正しい場所に配置されたように見えます。
ただし、 qscintilla2 をインポートしようとすると
次のエラーが表示されます。
したがって、モジュールは libQtGui.4.dylib を見つけることができないようです
私は優れたブログhttps://mikeash.com/pyblog/friday-qa-2009-11-06-linking-and-install-names.htmlで@rpath変数を読んで、私が知っていることになりましたこの問題を解決するためにotool
andを使用する必要があります。install_name_tool
実行するotool -L
と、次の出力が得られます。
そしてotool -lは私に与えます
私が見る限り、このモジュールには @rpath のエントリはありません (または、少なくとも LC_RPATH コマンドを見つけるべきでしたか?)。もちろん、後で install_name_tool を使用してこれを設定できますが、ここで行き詰まります。
この状況で Qsci.so モジュールの @loader_path および @executable_path と見なされるものを理解できません。それはに位置しています
しかし、それはへの直接参照のようです
この場合、 /Users/daniel/anaconda/lib/python2.7/site-packages/PyQt4/ または /Users/daniel/anaconda/lib/ は @loader_path になりますか? @executable_path は、/Users/daniel/anaconda/bin にある Python インタープリターのパスを指しているだけだと思いますが、間違っている場合は修正してください。
libQtGui.4.dylib と libQtCore.4.dylib はどちらも次の場所にあります。
正しい@rpathsと思われるものを手動で追加しようとしました
Qsci.so の格納フォルダーが @loader_path であると仮定した最初のエントリと libqscintilla2.11.dylib の 2 番目のエントリですが、役に立ちません...
@rpath に絶対パスを追加すると
それは問題を解決するので、これがrpathの問題であることはわかっています。ただし、これを正しく取得したらアプリをパッケージ化する予定であるため、相対的な場所が必要です。
ご協力いただきありがとうございます。この投稿が意図したよりも長くなってしまったことをお詫びします。
c++ - CMake から生成された Make Install で RPath が機能しない
動的ライブラリを実行可能ファイルにリンクしようとしている小さなサンプル プロジェクトを取得しました。
ファイル構造は次のとおりです。
-事業
--dlibs
----engine.h
----engine.cpp
----CMakeLists.txt
- EXE
----main.h
----main.cpp
----CMakeLists.txt
これは私がそれを実行するために行うことです:
私が得るエラー:
ただし、ビルド フォルダー内に生成されたファイルは機能します。私の知る限り、「make install」を使用している場合は相対 RPath を設定する必要があり、これを試しました。
CMakteLists.txt (exe フォルダー) 内にありますが、結果は同じです。
RPath を設定する他のいくつかの方法を試しましたが、役に立ちませんでした。
どんな助けでも大歓迎です。
よろしくお願いします