2014-12-15 7 views
9

ich versuche, eine Bibliothek in C zu kompilieren, die „math.h“ benötigen, ist hier der Anfang der C-Datei:C - undefined Verweis auf „sqrt“ auch mit ‚-Im‘

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 
#include <time.h> 
#include "sparse_matrix.h" 
... 

und ich kompiliere mit diesem Befehl:

gcc -c ./sparse_matrix.c -o sparse_matrix.o -lm -Wall -pedantic -std=c99 -g -O 

aber auch mit den #include getan und der Flagge -lm nach der Datei (ich habe am Ende der Linie versucht, aber nichts geändert) ich bekomme immer noch den Fehler: undefined reference to « sqrt » collect2: error: ld returned 1 exit status

Ich verstehe es nicht nach einer Stunde googeln das Problem. Ich arbeite mit gcc 4.9 unter Ubuntu 14.10 (utopic Einhorn). Vielen Dank für jede Hilfe im Voraus!

+0

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. –

+0

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) –

Antwort

10

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.

+0

Vielen Dank! Mit der '-c' Flagge wird der Linker überhaupt nicht aufgerufen, es war ein Fehler. Aber ich habe es ohne das Flag -c versucht (gcc sparse_matrix.c -o sparse_matrix.o -Wall -pedantic -std = c99 -g -O -lm). Aber ich habe einen undefinierten Bezug auf "main". Wie gesagt, ich versuche nur eine Bibliothek "Sparse_Matrix" zu erstellen, die "sqrt" -Funktion von "libmath" benötigt. –

+1

@Alex, überprüfen Sie, ob es tatsächlich _ist_ ein 'main' in dieser C-Datei. Wenn Sie die Kompilierung von den Linkstufen trennen, ist es wahrscheinlich, dass sie in einer anderen C-Datei vorhanden ist. Wenn du nur eine Bibliothek mit Objekten erstellst (kein 'main'), ist' -c' der richtige Weg, aber das Einbringen der Math-Bibliothek sollte während des Linkens erfolgen, wenn ein Client von dir benötigt wird um deine Sachen zu benutzen: 'gcc client_stuff.c -lsparse_matrix_lib -lm ...'. – paxdiablo

+0

Ja, das habe ich versucht. Danke, ich bin nicht so einfach mit der Bibliothek und ich dachte, ich könnte eine Lib in eine andere verknüpfen. Entschuldigung für diesen eher einfachen Fehler. Ich habe gerade versucht mit meinem Hauptprogramm, das diese Bibliothek verwendet und (jetzt, da ich das verstehe) es gut funktioniert (nur '-lm' nicht zum Zeitpunkt der Kompilierung der Bibliothek hinzugefügt, sondern in der Verknüpfungsstufe des Programms mit meiner lib):) Danke nochmal für so schnelle Antworten! –