17

特別な文字列$ORIGINを含むRPATHを、Code ::BlocksIDEでGCCを使用して構築された実行可能ファイルにリンクしようとしています。指定しました

-Wl,-R$ORIGIN

プロジェクトのリンカオプションにありますが、GCCへのコマンドライン出力が間違っています(わかりやすくするために削除されています)。

g++ -Wl,-R

Code :: Blocksにこの引数を指定する正しい方法は何ですか?

4

3 に答える 3

36

トークン$ORIGINを作成することを決定した人は誰でも、プログラマー地獄の特別な場所に値する邪悪な野郎です。'$'はbashやmakeなどの他のスクリプト言語の特殊文字であるため、慎重にエスケープしない限り、すべてを台無しにします。さらに悪いことに、使用しているビルド環境によっては、適切にエスケープする方法の詳細が変わる可能性があります。

bashでは、$の前に円記号を付ける必要があります。

-Wl,-R\$ORIGIN

Code :: Blocksは、$を特別なものとして扱うようです。次に、サブプロセスコントローラーのCode :: Blocksがコマンドを送信して、バックスラッシュを特殊なものとして扱います。したがって、適切にエスケープするには、バックスラッシュと$の両方を2倍にする必要があります。したがって、Code :: Blocksリンカー設定では、以下を指定する必要があります。

-Wl,-R\\$$ORIGIN

...出力:

-Wl,-R\\$ORIGIN

...ビルドログに送信されますが、シェルは実際に送信されます:

-Wl,-R\$ORIGIN

...上記のように、望ましい結果が得られます。

なんて痛い。

于 2008-10-23T16:16:21.173 に答える
15

Code:Blocks の質問に対処する kblucks の回答に加えて.... Make でこれを行う方法を探してこのページに出くわした私のような人のために。トリックは、追加の $ 記号をエスケープ文字として使用し、引用符で囲むことです。

-Wl,-R,'$$ORIGIN/../lib'

完全な説明はここにあります: Using ORIGIN for a dynamic runtime library search path

于 2009-09-30T22:29:47.323 に答える
1

あなたの実行可能ファイルが、あなたによって作成されたものではない巨大で複雑なスクリプト環境によって構築されていて、それを深く掘り下げたくない場合は、setenv LD_RUN_PATH='$ORIGIN/../lib';で実行してみてください。それがうまくいかない場合、実用的なアプローチは ld のラッパーを作成することです:

#!/bin/sh
exec /usr/bin/ld -R '$ORIGIN/../lib' "$@"

...次に、パス上のスタブを使用してビルドを実行します。実際には、.so ファイルやその他の実行可能ファイルをビルドするために呼び出されることがあるため、RPATH を挿入するかどうかを決定するより複雑なスクリプトにする必要がある場合があります。または、これを使用せずにビルドを実行し、チェリー ピックを使用して実行します。

(ここで、「/usr/bin/ld」は通常実行される ld であり、別の場所にある可能性があります。gcc はパスから ld を取得しない場合があります。gcc 環境変数を参照して上書きしてください。マイレージは異なる場合があります。他のアプローチよりもひどいものではないことを保証するものではありません)。

于 2013-01-17T18:01:46.797 に答える