Warum führt die Reihenfolge, in der Bibliotheken gelinkt werden, manchmal zu Fehlern im GCC?
Antworten
Zu viele Anzeigen?Ein kleiner Tipp, der mich auf die Palme gebracht hat: Wenn Sie den Linker als "gcc" oder "g++" aufrufen, dann wird die Verwendung von "--start-group" und "--end-group" diese Optionen nicht an den Linker weitergeben - und auch keinen Fehler anzeigen. Der Link wird einfach mit undefinierten Symbolen fehlschlagen, wenn Sie die Reihenfolge der Bibliotheken falsch gewählt haben.
Sie müssen sie als "-Wl,--start-group" usw. schreiben, um GCC anzuweisen, das Argument an den Linker weiterzugeben.
Sie können die Option -Xlinker verwenden.
g++ -o foobar -Xlinker -start-group -Xlinker libA.a -Xlinker libB.a -Xlinker libC.a -Xlinker -end-group
ist ALMOST gleich
g++ -o foobar -Xlinker -start-group -Xlinker libC.a -Xlinker libB.a -Xlinker libA.a -Xlinker -end-group
Vorsichtig!
- Die Reihenfolge innerhalb einer Gruppe ist wichtig! Hier ein Beispiel: Eine Debug-Bibliothek hat eine Debug-Routine, aber die Nicht-Debug Bibliothek hat eine schwache Version der gleichen Routine. Sie müssen die Debug-Bibliothek ZUERST in die Gruppe aufnehmen, sonst wird die Nicht-Debug-Version aufgelöst.
- Sie müssen jeder Bibliothek in der Gruppenliste das Zeichen -Xlinker voranstellen
Ich habe das schon oft erlebt, einige unserer Module verknüpfen mehr als 100 Bibliotheken unseres Codes plus System- und Drittanbieter-Bibliotheken.
Abhängig von den verschiedenen Linkern HP/Intel/GCC/SUN/SGI/IBM/etc kann es zu ungelösten Funktionen/Variablen etc. kommen, auf einigen Plattformen müssen Bibliotheken doppelt aufgeführt werden.
In den meisten Fällen verwenden wir eine strukturierte Hierarchie von Bibliotheken, Kern, Plattform, verschiedenen Abstraktionsschichten, aber bei einigen Systemen muss man immer noch mit der Reihenfolge im Link-Befehl spielen.
Wenn Sie eine Lösung gefunden haben, dokumentieren Sie sie, damit der nächste Entwickler sie nicht noch einmal ausarbeiten muss.
Mein alter Dozent sagte immer: " hohe Kohäsion und geringe Kopplung ", das gilt auch heute noch.
- See previous answers
- Weitere Antworten anzeigen
1 Stimmen
Siehe auch jetzt stackoverflow.com/questions/7826448/ -- TLDR
gcc
vor kurzem zu einem (relativ) strengeren Verhalten übergegangen.