Was sind die Befehlszeilenoptionen --start-group und --end-group?

82

Was ist der Zweck dieser Befehlszeilenoptionen? Bitte helfen Sie dabei, die Bedeutung der folgenden Befehlszeile zu entschlüsseln:

-Wl,--start-group -lmy_lib -lyour_lib -lhis_lib -Wl,--end-group -ltheir_lib

Anscheinend hat es etwas mit dem Verknüpfen zu tun, aber das GNU-Handbuch ist leise, was genau Gruppierung bedeutet.

pic11
quelle

Antworten:

95

Es dient zum Auflösen zirkulärer Abhängigkeiten zwischen mehreren Bibliotheken (zwischen -(und aufgelistet -)).

Zitieren Warum verursacht die Reihenfolge, in der Bibliotheken verknüpft sind, manchmal Fehler in GCC? oder man ld http://linux.die.net/man/1/ld

-( Archive -) oder --start-group Archive --end-group

Die Archive sollten eine Liste von Archivdateien sein. Dies können entweder explizite Dateinamen oder -l-Optionen sein.

Die angegebenen Archive werden wiederholt durchsucht, bis keine neuen undefinierten Referenzen mehr erstellt werden. Normalerweise wird ein Archiv nur einmal in der Reihenfolge durchsucht, in der es in der Befehlszeile angegeben ist. Wenn ein Symbol in diesem Archiv benötigt wird, um ein undefiniertes Symbol aufzulösen, auf das von einem Objekt in einem Archiv verwiesen wird, das später in der Befehlszeile angezeigt wird, kann der Linker diese Referenz nicht auflösen. Durch Gruppieren der Archive werden alle wiederholt durchsucht, bis alle möglichen Referenzen aufgelöst sind.

Die Verwendung dieser Option verursacht erhebliche Leistungskosten. Es ist am besten, es nur zu verwenden, wenn zwischen zwei oder mehr Archiven unvermeidbare Zirkelverweise bestehen.

So können Bibliotheken innerhalb der Gruppe mehrmals nach neuen Symbolen durchsucht werden, und Sie benötigen keine hässlichen Konstrukte wie -llib1 -llib2 -llib1

PS-Archiv bedeutet im Grunde eine statische Bibliothek ( *.aDateien)

osgx
quelle
1
Akzeptiert. Eine Bemerkung: Ich glaube, dass GCC zuerst für dynamische Bibliotheken verwendet wird, es sei denn, der vollständige Dateiname (einschließlich Pfad und .a-Suffix) wird in der Befehlszeile übergeben. -llib1 würde dazu führen, dass GCC versucht, zuerst eine Verknüpfung mit der% .so-Datei und dann die% .a-Datei herzustellen.
Pic11
1
@ pic11, danke. Die Verknüpfung erfolgt durch ld, und Sie können sehen, wie Bibliotheken durchsucht werden, indem Sie -Wl,--verbosegcc eine Option hinzufügen (diese wird --verbosean linker ld übergeben). ZB für -ltestBibliothek : 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 . Linker versuchen zuerst zu öffnen .so, aber dann versuchen sie zu öffnen .a. Dies erfolgt in jedem Verzeichnis in Bibliotheks-Suchverzeichnissen.
Osgx
"mehrmals nach neuen Symbolen gesucht"? Ich denke, zweimal zu suchen ist genug, um alle Symbole aufzulösen. Das sollte nicht sein , erheblich Leistungskosten.
Jimm Chen
9
Entschuldigung, mir wurde endlich klar, dass "zweimal suchen" nicht genug ist.
Jimm Chen