Ich glaube nicht, dass ist der Befehl Sie laufen (na ja, kann es ein von ihnen sein, aber es ist sicherlich nicht die Ihr Fehler verursacht).
Die -c
Option gcc
sagt es nur, um die Objektdateien zu erstellen (und Sie sind speziell auf die Ausgabe an sparse_matrix.o
, eine Objektdatei, anstatt eine ausführbare Datei ein Senden).
In diesem Fall sollte der Linker nicht überhaupt aufgerufen werden.
In der Tat, mit einem Dummy sparse_matrix.c
von:
#include <math.h>
int main(void) {
return (int)(sqrt(16.0));
}
Ihr Befehl funktioniert gut, und wenn ich den Prozess komplett mit:
pax> gcc -o sparse_matrix sparse_matrix.o -lm
pax> ./sparse_matrix
pax> echo $?
4
können Sie sehen, dass es auch ganz gut läuft.
Es kann sein, dass Sie verlassen die Linker-Flags (wie -lm
) von der tatsächlichen Link Bühne aus, die dieses Problem verursachen würde. Sie sollten keinen Einfluss auf die Kompilierungsstufe haben (es sei denn, sie betreffen beide Kompilierungs-und Link-Stufen, aber -l
gehört nicht zu diesen).
Und, indem ich weglasse, schließe ich auch die Möglichkeit ein, "falsch zu platzieren". Einige Linker sind positional in der Art, wie sie Bibliotheken behandeln, indem sie nur Objekte aus Bibliotheken extrahieren, wenn sie ein undefiniertes Symbol an dem Punkt erfüllen, wo sie aufgeführt sind.
So wird der Befehl:
linker sparse_matrix.o -lm ...
funktionieren würde, weil die .o
Datei mit einem unbefriedigten Bezug auf sqrt
einführt, die von libm
erfüllt ist.Wenn Ihr Linker Positions ist, dann gilt:
linker -lm sparse_matrix.o ...
nicht, weil funktionieren würde, zum Zeitpunkt der Verarbeitung libm
gab es keine unbefriedigt Symbole so nichts extrahiert wurde. Die undefinierte Referenz auf sqrt
wird dann nach dieser Punkt eingeführt und es gibt keine anderen Objekte oder Bibliotheken, um es zu erfüllen.
Ob ld
oder die gcc
Linker-Stufe hat diese Einschränkung, ich weiß nicht, ich hebe nur die Möglichkeit als etwas aufpassen auf.
Die '-c' Option unterdrückt die Verknüpfung. Sie erhalten diesen Fehler nicht über diese Befehlszeile. Daher ist das nicht die Befehlszeile, die den Fehler verursacht. (Verwenden Sie nicht @ vor Regeln in einem 'Makefile' - es ist wahrscheinlich nicht Ihr Problem, aber es versteckt Befehle und kann Sie in die Irre führen.) Und das meiste ist das, was @paxdiablo gesagt hat. –
mögliches Duplikat von ["undefinierter Verweis auf \ 'pow'" selbst mit math.h und dem Bibliothekslink -lm] (http://stackoverflow.com/questions/16344445/undefined-reference-to-pow-even-with -math-h-und-die-library-link-lm) –