--start-groupおよび--end-groupコマンドラインオプションとは何ですか?


83

これらのコマンドラインオプションの目的は何ですか?次のコマンドラインの意味を解読するのを手伝ってください:

どうやらそれはリンクと関係があるようですが、GNUマニュアルは正確にグループ化が意味することを静かにしています。

回答:


97

これは、複数のライブラリ(-(との間にリストされている-))間の循環依存関係を解決するためのものです。

引用ライブラリがリンクされている順序がGCCでエラーを引き起こすことがあるのはなぜですか?またはman ld http://linux.die.net/man/1/ld

-( アーカイブ -)または--start-group アーカイブ --end-group

アーカイブは、アーカイブファイルのリストでなければなりません。それらは、明示的なファイル名または-lオプションのいずれかです。

指定されたアーカイブは、新しい未定義の参照が作成されなくなるまで繰り返し検索されます。通常、アーカイブはコマンドラインで指定された順序で1回だけ検索されます。後でコマンドラインに表示されるアーカイブ内のオブジェクトによって参照される未定義のシンボルを解決するためにそのアーカイブ内のシンボルが必要な場合、リンカはその参照を解決できません。アーカイブをグループ化することにより、考えられるすべての参照が解決されるまで、すべてのアーカイブが繰り返し検索されます。

このオプションを使用すると、パフォーマンスに大きなコストがかかります。2つ以上のアーカイブ間に避けられない循環参照がある場合にのみ使用することをお勧めします。

そのため、グループ内のライブラリで新しいシンボルを数回検索でき、次のような醜い構造は必要ありません。 -llib1 -llib2 -llib1

PSアーカイブとは、基本的に静的ライブラリ(*.aファイル)を意味します


1
受け入れられました。備考:完全なファイル名(パスと.aサフィックスを含む)がコマンドラインで渡されない限り、GCCは最初にダイナミックライブラリを使用すると思います。-llib1を使用すると、GCCは最初に%.soファイルにリンクし、次に%.aファイルにリンクしようとします。
pic11 2011

1
@ pic11、ありがとう。リンクはldによって行われ、-Wl,--verbosegccにオプションを追加してライブラリがどのように検索されるかを確認できます(--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。これは、ライブラリ検索ディレクトリのすべてのディレクトリで実行されます。
osgx 2011

「新しいシンボルを数回検索しました」?すべてのシンボルを解決するには、2回検索するだけで十分だと思います。これは、大きなパフォーマンスコストになりませ
Jimm Chen 2012

10
申し訳ありませんが、ついに「2回検索」では不十分だと気づきました。
Jimm Chen 2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.