596 Stimmen

Warum führt die Reihenfolge, in der Bibliotheken gelinkt werden, manchmal zu Fehlern im GCC?

Warum führt die Reihenfolge, in der Bibliotheken gelinkt werden, manchmal zu Fehlern im GCC?

1 Stimmen

Siehe auch jetzt stackoverflow.com/questions/7826448/ -- TLDR gcc vor kurzem zu einem (relativ) strengeren Verhalten übergegangen.

10voto

M.M Punkte 134165

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.

6voto

yundorri Punkte 51

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!

  1. 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.
  2. Sie müssen jeder Bibliothek in der Gruppenliste das Zeichen -Xlinker voranstellen

4voto

titanae Punkte 2269

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.

4voto

David Cournapeau Punkte 74679

Die Reihenfolge der Links spielt eine Rolle, zumindest auf einigen Plattformen. Ich habe Abstürze bei Anwendungen gesehen, die mit Bibliotheken in falscher Reihenfolge gelinkt wurden (wobei falsch bedeutet, dass A vor B gelinkt wurde, aber B von A abhängt).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X