3

静的ライブラリを使用してプログラムをコンパイルするとき、多くのソース (SO コミュニティを含む) から、ライブラリを 2 回含めるように提案されました。

次のように:

gcc main.c -lslA -lslB -lslC -lslA -lslB -o final
  1. これにより、実行可能ファイルが大きくなりますか (つまり、リンカは、二重のインクルードを回避するのに十分スマートですか?)。

  2. これ(複数の包含)は適切な解決策ですか、それとも回避策ですか(つまり、それを処理するのが難しい場合でも、より適切な方法が常に存在します)

4

1 に答える 1

13

ライブラリを複数回含める唯一の理由は、たとえば、slAによって解決されたシンボルslBslB必要であるが、によって必要とされるシンボルが必要な場合ですslA。リンカーはシンボルを解決するために 1 回のパスを実行しますが、ライブラリを繰り返すと、実質的にそのライブラリで 2 回目のパスが発生します。出力のサイズは変更されませんが、必要でもありません。

ライブラリを複数回提示する代わりに、gcc リンカーに特定のライブラリをグループ化するように指示できます。つまり、そのグループ内のシンボルを解決するために必要なことを実行させます。例えば:

gcc main.c -Wl,--start-group -lslA -lslB -lslC -Wl,--end-group -o final

于 2013-04-11T11:02:03.127 に答える