Code :: Blocks GCCで動作するように$ ORIGINでRPATHを取得する方法は?
-
04-07-2019 - |
質問
特殊な文字列$ ORIGINを含むRPATHを、Code :: Blocks IDEでGCCを使用してビルドされた実行可能ファイルにリンクしようとしています。指定しました
-Wl,-R$ORIGIN
プロジェクトのリンカーオプションでは、GCCへのコマンドライン出力が間違っています(わかりやすくするために省略しています):
g++ -Wl,-R
Code :: Blocksにこの引数を指定する正しい方法は何ですか?
解決
トークンを$ ORIGINにすることを決めた人は、プログラマの地獄で特別な場所に値する邪悪な野郎です。 '$'はbashやmakeなどの他のスクリプト言語の特殊文字であるため、慎重にエスケープしない限り、すべてを台無しにします。さらに悪いことに、使用しているビルド環境によっては、適切にエスケープする方法の詳細が変わる可能性があります。
bashでは、$の前にバックスラッシュを付ける必要があります:
-Wl,-R\$ORIGIN
Code :: Blocksは、明らかに$も特別なものとして扱います。次に、サブプロセスコントローラーCode :: Blocksは、バックスラッシュを特別なものとして扱うコマンドを送信します。したがって、適切にエスケープするには、バックスラッシュと$の両方を二重にする必要があります。したがって、Code :: Blocksリンカー設定では、次を指定する必要があります。
-Wl,-R\\$ORIGIN
...出力:
-Wl,-R\\$ORIGIN
...ビルドログに送信されますが、シェルは実際に送信されます:
<*>...前述のとおり、目的の結果が生成されます。
なんて痛い。
他のヒント
Code:Blocksの質問に対応するkblucksの回答に加えて... Makeでこれを行う方法を探しているこのページを偶然見つけた私のような人のために。 トリックは、余分な$記号をエスケープ文字として使用し、引用符で囲むことです:
-Wl,-R,'$ORIGIN/../lib'
完全な説明はここにあります: 動的ランタイムでのORIGINの使用ライブラリ検索パス
自分で作成したのではなく、巨大な複雑なスクリプト環境で実行可能ファイルを構築している場合、それを詳しく調べたくない場合は、 setenv LD_RUN_PATH = '$ ORIGIN /../ lib'で実行してみてください
;それがうまくいかない場合、実用的なアプローチはldのラッパーを作成することです:
#!/bin/sh
exec /usr/bin/ld -R '$ORIGIN/../lib' "$@"
...その後、パス上のそのスタブを使用してビルドを実行します。実際には、.soファイルまたは他の実行可能ファイルをビルドするために呼び出される場合があるため、RPATHを挿入するかどうかを決定するより複雑なスクリプトにする必要があります。または、これなしでビルドを実行し、チェリーピックを使用してビルドします。
(ここで&quot; / usr / bin / ld&quot;は通常実行されていたldであり、gccはパスからldを取得できない場合があります。gcc環境変数を参照してオーバーライドしてください。単一使用のみ。他のアプローチよりもひどくないという保証はありません。