3

g++シンボルの複数の定義を許可するようにリンカーに指示するにはどうすればよいですか (最初の出現を選択します)。

-z multidefs 複数のシンボル定義を許可します。デフォルトでは、再配置可能オブジェクト (.o ファイル) 間で複数のシンボル定義が発生すると、致命的なエラー状態になります。このオプションは、エラー状態を抑制し、最初のシンボル定義を取得できるようにします。このオプションは、-b svr4 オプションが指定されている場合にのみ有効です。

この-zmuldefsオプションは 、または によって認識されg++ません-z OPTION。正しいパラメータは何ですか? 出来ますか?

4

2 に答える 2

6

「g++ のリンカー」などというものはなく、システム独自のリンカーを使用します。

GCC からリンカーにオプションを渡すには、GCC の-Wl,または-Xlinkerオプションを使用する必要があります。

-Xlinker option
optionオプションとしてリンカーに 渡します。これを使用して、GCC が認識できないシステム固有のリンカー オプションを提供できます。
別の引数をとるオプションを渡したい場合は-Xlinker、オプション用に 1 回、引数用に 1 回、合計 2 回使用する必要があります。たとえば、 を渡す-assert definitionsには、 と書く必要があります-Xlinker -assert -Xlinker definitions-Xlinker "-assert definitions"これは文字列全体を単一の引数として渡しますが、これはリンカが期待するものではないため、write は機能しません。
GNU リンカを使用する場合、通常、構文を使用してリンカ オプションに引数を渡す方option=valueが、個別の引数として渡すよりも便利です。たとえば-Xlinker -Map=output.map-Xlinker -Map -Xlinker output.map. 他のリンカーは、コマンド ライン オプションのこの構文をサポートしていない場合があります。

-Wl,option
optionオプションとしてリンカーに 渡します。カンマを含む場合option、カンマで複数のオプションに分割されます。この構文を使用して、オプションに引数を渡すことができます。たとえば、リンカーに-Wl,-Map,output.map渡します。-Map output.mapGNU リンカーを使用する場合は、 を使用しても同じ効果が得られ-Wl,-Map=output.mapます。

だからあなたは使いたいと思うでしょう

-Xlinker -z -Xlinker multidefs

また

-Wl,-z,multidefs

しかし、引用したドキュメントには-b svr4、そのオプションを使用するためにも使用する必要があると書かれています。

-Wl,-b,svr4,-z,multidefs

編集:あなたのコメントから、ダーウィン リンカーを使用する Mac OS X を使用していることがわかります。そのマニュアル ページには、対応するオプションが廃止されていることが示されています。

-m 複数の定義をエラーとして扱わないでください。これはサポートされなくなりました。このオプションは廃止されました。

于 2013-07-03T10:38:18.893 に答える