2014-08-29 4 views
6

Ich kompiliere ein Testprogramm, um die fftw3 (ver3.3.4) zu testen. Da es nicht mit Root installiert ist previlidge der Befehl I:kann nicht mit der Bibliothek fftw3 verlinken

gcc -lm -L/home/my_name/opt/fftw-3.3.4/lib/ -I/home/my_name/opt/fftw-3.3.4/include/ fftwtest.c 

wo die Bibliothek in

/home/my_name/opt/fftw-3.3.4/ 

Mein Code installiert ist das erste Tutorial auf fftw3 Webseite ist:

#include <stdio.h> 
#include <fftw3.h> 
int main(){ 
    int n = 10; 
    fftw_complex *in, *out; 
    fftw_plan p; 

    in = (fftw_complex*) fftw_malloc(n*sizeof(fftw_complex)); 
    out = (fftw_complex*) fftw_malloc(n*sizeof(fftw_complex)); 
    p = fftw_plan_dft_1d(n, in, out, FFTW_FORWARD, FFTW_ESTIMATE); 

    fftw_execute(p); /* repeat as needed */ 

    fftw_destroy_plan(p); 

    fftw_free(in); fftw_free(out); 

    return 0; 
} 

Wenn ich das Programm kompiliert, gibt es mir folgende Fehler zurück:

/tmp/ccFsDL1n.o: In function `main': 
fftwtest.c:(.text+0x1d): undefined reference to `fftw_malloc' 
fftwtest.c:(.text+0x32): undefined reference to `fftw_malloc' 
fftwtest.c:(.text+0x56): undefined reference to `fftw_plan_dft_1d' 
fftwtest.c:(.text+0x66): undefined reference to `fftw_execute' 
fftwtest.c:(.text+0x72): undefined reference to `fftw_destroy_plan' 
fftwtest.c:(.text+0x7e): undefined reference to `fftw_free' 
fftwtest.c:(.text+0x8a): undefined reference to `fftw_free' 
collect2: ld returned 1 exit status 

Eine schnelle Suche bedeutet, dass ich nicht korrekt mit der Bibliothek verlinke, aber interessanterweise beklagt es sich nicht über die Deklaration von fftw_plan und fftw_complex. In der Tat, wenn ich alle Funktionen entferne, die mit "fftw_" beginnen und nur die Deklaration beibehalten, wird die Kompilierung bestanden.

Also, wo bin ich falsch gelaufen? Ist die Verknüpfung korrekt? Jeder Vorschlag wäre willkommen.

Antwort

6

Sie haben dem Linker mitgeteilt, wo die Bibliothek zu finden ist -L, aber Sie haben nicht angegeben, welche Bibliothek zu verknüpfen. Letzteres tun Sie, indem Sie -lfftw3 am Ende der Zeile vor -lm hinzufügen.

Zusätzlich muss das -L Flag nach fftwtest.c aufgeführt werden.

+0

Und ich hätte alle Flags nach dem Namen der C-Datei gesetzt. – robinchm

+0

Ah ja, ein guter Punkt den ich oft vergesse. – downhillFromHere

1

Sie müssen auch hinzufügen, dass Sie mit der Bibliothek fftw verlinken.

hinzufügen so etwas wie:

-lfftw 

Es hängt davon ab, was die Bibliotheksdatei ist tatsächlich aufgerufen. (Beachten Sie, wie Sie das für die Mathebibliothek mit -lm tun.)