11

Linux Qt プログラムがあります。実行可能ファイルのディレクトリにある (動的) Qt ライブラリが存在する場合はそれを優先的に使用し、そうでない場合はシステムの Qt ライブラリを使用するようにしたいと思います。救助へのRPATH。

次の行をqmakeの .pro ファイルに追加します。

QMAKE_LFLAGS    += '-Wl,-rpath,\'\$$ORIGIN\''

結果の実行可能ファイルをreadelfで見ると、次のようになります。

0x000000000000000f (RPATH)              Library rpath: [$ORIGIN:/usr/local/Trolltech/Qt-5.2.0/lib]
0x000000000000001d (RUNPATH)            Library runpath: [$ORIGIN:/usr/local/Trolltech/Qt-5.2.0/lib]

正しいようですが、lddはシステム バージョンを使用していることを示しています。

libQt5Core.so.5 => /usr/local/Trolltech/Qt-5.2.0/lib/libQt5Core.so.5 (0x00007f2d2fe09000)

qmake の結果の Makefile を手動で編集して 2 つの rpath の順序を交換すると、$ORIGIN が /usr/local/... の後に来るため、正しい動作が得られます。

0x000000000000000f (RPATH)              Library rpath: [/usr/local/Trolltech/Qt-5.2.0/lib:$ORIGIN]
0x000000000000001d (RUNPATH)            Library runpath: [/usr/local/Trolltech/Qt-5.2.0/lib:$ORIGIN]

libQt5Core.so.5 => ./libQt5Core.so.5 (0x00007fb92aba9000)

私の問題は、qmakeが最終的な LFLAGS 変数を構築する方法にあります。システム ライブラリの後に追加 ($ORIGIN) を追加する方法がわかりません。何か案は?

4

4 に答える 4

13

以下を .pro ファイルに追加して、動的リンカーが Linux での実行時に Qt アプリケーションと同じディレクトリを参照するように強制できます。

unix:{
    # suppress the default RPATH if you wish
    QMAKE_LFLAGS_RPATH=
    # add your own with quoting gyrations to make sure $ORIGIN gets to the command line unexpanded
    QMAKE_LFLAGS += "-Wl,-rpath,\'\$$ORIGIN\'"
}

実行可能パスのサブディレクトリを検索する場合は、次を使用できます。

QMAKE_LFLAGS += "-Wl,-rpath,\'\$$ORIGIN/libs\'"

アプリケーション ディレクトリに、まったく同じ名前の .so ファイルが必要であることに注意してください。たとえばlibQt5Core.so.5.2.0、名前を付けてアプリケーション ディレクトリにコピーする必要がありますlibQt5Core.so.5。これで、ldd にアプリケーションのディレクトリが表示されます。

また、アプリケーション ディレクトリにlibQt5Core.so.5.2.0その名前のリンクを含めることもできます。libQt5Core.so.5

于 2014-12-10T04:12:25.097 に答える
1

私の調査によると、QMake ではリストの先頭にのみ RPATH を追加できます。

しかし、Linux を使用していて をインストールできる場合はchrpath、それを回避できます。

このブロックを .pro ファイルの最後に追加します

# Add spacing since chrpath cannot expand RPATH length
QMAKE_RPATHDIR = \
    /XYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXY1\
    /XYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXY2\
    /XYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXY3\
    /XYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXY4
QMAKE_POST_LINK += 'chrpath -r \'/my/qt/installation:\$$ORIGIN\' $$OUT_PWD/mybinaryname;'
于 2014-12-09T21:33:32.240 に答える
0

私は何が起こっているのか少し推測していますが、それは ld の奇妙な動作のいくつかを知っていることに基づいています。

LD_LIBRARY_PATHRUNPATH 変数の処理前に有効になる変数の存在をチェックします。RPATHとの両方が存在するためRUNPATHLD_LIBRARY_PATHルールが有効になるため、設定されている場合は設定を解除します。

第二に、私は決して期待していません:

libQt5Core.so.5 => ./libQt5Core.so.5 (0x00007fb92aba9000)

の出力では、バイナリのディレクトリへlddの展開が常に表示$ORIGINされます (短縮したのでしょうか?)。

libQt5Core.so.5 => /path/to/bin/./libQt5Core.so.5 (0x00007fb92aba9000)

つまり、LD_LIBRARY_PATH拡張はのよう.:/usr/local/Trolltech/Qt-5.2.0/libに聞こえますが、環境のオーバーライドが発生しているように聞こえます。

于 2014-12-09T17:52:39.510 に答える