Ich habe ein c-Programm, das sin, cos und acos aufruft. Beim Kompilieren bekomme ich folgende Fehler:
%Vor%Ich weiß, dass das üblich ist, wenn Sie das Flag -lm gcc nicht verwenden. Ich benutze diese Flagge. Ich rufe GCC so an:
%Vor%Wenn ich auf einem meiner Computer kompiliere, funktioniert das gut. Der einzige Unterschied, den ich mir denken kann ist, dass dies nicht auf x86_64 funktioniert und der Computer, auf dem es funktioniert, ist i686. Beide sind Ubuntu. Die Datei libm.a ist auf dem Computer vorhanden, an dem sie gerade nicht arbeitet, und es werden keine Fehler gemeldet, dass sie nicht gefunden werden kann. Was könnte das verursachen?
Sie sollten -lm
nach main.c
Wenn Sie mehrere Bibliotheken haben, sollten diese im Allgemeinen in der Reihenfolge ihrer Verwendung geschrieben werden. Wenn beispielsweise die Bibliothek A
die Bibliothek B
verwendet, sollten Sie -lA -lB
.
In Ihrem Fall verwendet die Objektdatei, die das Ergebnis der Kompilierung von main.c
ist, die Bibliothek m
und daher sollte -lm
danach kommen.
Für die Neugierigen ist dies hauptsächlich aus Gründen der Effizienz. Mit diesem Schema kann der Linker derzeit unbekannte Symbole mit jeder neuen Bibliothek auflösen, die in der Argumentliste zu sehen ist, und neue unbekannte Symbole aus dieser Bibliothek auf dem Weg aufnehmen. Dies bedeutet, dass der Linker die Bibliotheken einzeln besuchen kann und daher die unbekannten Symbole mit einer kleinen Anzahl von Symbolen vergleicht, die von jeder Bibliothek bereitgestellt werden.
Im Gegensatz dazu könnte der Linker Symbole aus allen Bibliotheken gleichzeitig laden und dann mit unbekannten Symbolen beginnen. In diesem Fall muss der Linker jedoch mit einer viel größeren Anzahl von Symbolen umgehen, was sowohl den Speicherbedarf als auch die Ausführungszeit des Linkers erhöht.
Da die Bibliotheken immer in der richtigen Reihenfolge ihrer Abhängigkeiten zum Linker deklariert werden konnten, gibt es keinen Grund für den Linker, den ineffizienten Weg zu wählen.
1 Bibliotheken haben normalerweise eine einseitige Beziehung in dem Sinne, dass man das andere benutzt. Kreisförmige Abhängigkeiten zwischen Bibliotheken sind selten, wenn überhaupt vorhanden, aber sie könnten dennoch mit diesem Modell verwendet werden, indem bestimmte Bibliotheken wiederholt werden, um erneut geprüft zu werden.