web-dev-qa-db-ja.com

gccの「-Wl、option」構文と「-Xlinkeroption」構文の違い

私はいくつかの構成ファイルを調べていて、両方が使用されているのを見てきました(アーキテクチャは異なりますが)。 Linuxボックスでgccを使用している場合、リンカーにオプションを渡すための2つの構文に違いはありますか? gccのマニュアルを読むと、私が知る限り、それらはほとんど同じように説明されています。

29
bpw1621

man gccを調べる以外に何をすべきか本当にわかりません。これは、gccの呼び出しに関する今後の質問に備えて覚えておく必要があります。そう:

-Xlinkerオプション

オプションとしてオプションをリンカに渡します。これを使用して、GCCが認識方法を知らないシステム固有のリンカーオプションを提供できます。

別の引数を取るオプションを渡したい場合は、-Xlinkerを2回使用する必要があります。1回はオプション用、もう1回は引数用です。たとえば、-assert定義を渡すには、-Xlinker -assert-Xlinker定義を記述する必要があります。 -Xlinker "-assertdefinitions"を記述しても機能しません。これは文字列全体を単一の引数として渡すためです。これはリンカーが期待するものではありません。

GNUリンカーを使用する場合、通常、個別の引数としてよりも、option = value構文を使用してリンカーオプションに引数を渡す方が便利です。たとえば、-Xlinker -Map = outputを指定できます。 -Xlinker -Map -Xlinker output.mapではなくmap。他のリンカーは、コマンドラインオプションでこの構文をサポートしていない場合があります。

-Wl、オプション

オプションとしてオプションをリンカに渡します。オプションにコンマが含まれている場合、コンマで複数のオプションに分割されます。この構文を使用して、オプションに引数を渡すことができます。

たとえば、-Wl、-Map、output.mapは、-Mapoutput.mapをリンカーに渡します。 GNUリンカーを使用する場合、-Wl、-Map = output.mapでも同じ効果を得ることができます。

ご覧のとおり、唯一の違いは、-Wlでは、-Wl,-rpath,/my/libsのように、カンマを使用して複数の引数を指定できることです。これは、-Xlinkerでは実行できません。一方、-Xlinkerはもう少し自己記述的かもしれません。好きなものを選んでください。また、他のコンパイラー(nvccが思い浮かび、clang)をチェックして、構文に同意するコンパイラーがあるかどうかを確認し、それが重要な場合は移植性のために使用します。

35
Kerrek SB