これらのコマンドラインオプションの目的は何ですか?次のコマンドラインの意味を解読するのを手伝ってください:
-Wl,--start-group -lmy_lib -lyour_lib -lhis_lib -Wl,--end-group -ltheir_lib
どうやらそれはリンクと関係があるようですが、GNUマニュアルは正確にグループ化が意味することを静かにしています。
回答:
これは、複数のライブラリ(-(
との間にリストされている-)
)間の循環依存関係を解決するためのものです。
引用ライブラリがリンクされている順序がGCCでエラーを引き起こすことがあるのはなぜですか?またはman ld
http://linux.die.net/man/1/ld
-(
アーカイブ-)
または--start-group
アーカイブ--end-group
アーカイブは、アーカイブファイルのリストでなければなりません。それらは、明示的なファイル名または-lオプションのいずれかです。
指定されたアーカイブは、新しい未定義の参照が作成されなくなるまで繰り返し検索されます。通常、アーカイブはコマンドラインで指定された順序で1回だけ検索されます。後でコマンドラインに表示されるアーカイブ内のオブジェクトによって参照される未定義のシンボルを解決するためにそのアーカイブ内のシンボルが必要な場合、リンカはその参照を解決できません。アーカイブをグループ化することにより、考えられるすべての参照が解決されるまで、すべてのアーカイブが繰り返し検索されます。
このオプションを使用すると、パフォーマンスに大きなコストがかかります。2つ以上のアーカイブ間に避けられない循環参照がある場合にのみ使用することをお勧めします。
そのため、グループ内のライブラリで新しいシンボルを数回検索でき、次のような醜い構造は必要ありません。 -llib1 -llib2 -llib1
PSアーカイブとは、基本的に静的ライブラリ(*.a
ファイル)を意味します
-Wl,--verbose
gccにオプションを追加してライブラリがどのように検索されるかを確認できます(--verbose
リンカーldに渡されます)。例:-ltest
ライブラリ:attempt to open /lib/libtest.so failed \n attempt to open /lib/libtest.a failed \n attempt to open /usr/lib/libtest.so failed \n attempt to open /usr/lib/libtest.a failed \n
。リンカーは.so
最初に開こうとしますが、次に開こうとします.a
。これは、ライブラリ検索ディレクトリのすべてのディレクトリで実行されます。