それは、GNU リンカが使用するリンク アルゴリズムがどのように機能するかによるものです (少なくとも、静的ライブラリのリンクに関しては)。リンカーはシングル パス リンカーであり、一度表示されたライブラリを再度参照することはありません。
ライブラリは、オブジェクト ファイルのコレクション (アーカイブ) です。オプションを使用してライブラリを追加すると、リンカはライブラリからすべてのオブジェクト ファイルを-l
無条件に取得するわけではありません。現在必要なオブジェクト ファイル、つまり現在未解決の (保留中の) シンボルを解決するファイルのみを取得します。その後、リンカーはそのライブラリを完全に忘れます。
保留中のシンボルのリストは、リンカーが入力オブジェクト ファイルを左から右に次々と処理するときに、リンカーによって継続的に維持されます。各オブジェクト ファイルを処理するときに、一部のシンボルが解決されてリストから削除され、他の新しく発見された未解決のシンボルがリストに追加されます。
そのため、 を使用してライブラリを含めた場合-l
、リンカーはそのライブラリを使用して、現在保留中のシンボルを可能な限り解決し、そのライブラリを完全に忘れます。後で突然、そのライブラリから追加のオブジェクト ファイルが必要になったことが判明した場合、リンカはそのライブラリに「戻って」それらの追加のオブジェクト ファイルを取得することはありません。もう手遅れです。
このため、リンカーのコマンド ラインの後半-l
でオプションを使用することを常にお勧めします。これにより、リンカーが必要なオブジェクト ファイルと不要なオブジェクト ファイルを確実に判断できるようになります。オプションをリンカーの最初のパラメーターとして配置することは、一般にまったく意味がありません。最初は、保留中のシンボルのリストは空です (または、より正確には、単一のシンボルで構成されます)。つまり、リンカーは何も取得しません。まったく図書館。-l
-l
main
あなたの場合、オブジェクトファイルexample.o
にはシンボルなどへの参照が含まれていますud_init
。ud_set_input_file
リンカーは最初にそのオブジェクトファイルを受け取る必要があります。これらのシンボルを保留中のシンボルのリストに追加します。その後、-l
オプションを使用してライブラリを追加できます: -ludis86
. リンカーはライブラリを検索し、保留中のシンボルを解決するすべてのものをライブラリから取得します。
コマンドラインの最初にオプションを配置する-ludis86
と、リンカはライブラリを効果的に無視ud_init
します。これは、最初は などが必要であることを認識していないためですud_set_input_file
。後で処理example.o
するときに、これらのシンボルを検出し、保留中のシンボルに追加します。リスト。しかし、これらのシンボルは、-ludis86
既に処理されている (事実上無視されている) ため、最後まで未解決のままになります。
2 つ (またはそれ以上) のライブラリが相互に循環的に参照する場合-l
、同じライブラリでオプションを 2 回使用して、そのライブラリから必要なオブジェクト ファイルを取得する機会をリンカーに 2 回与える必要がある場合もあります。