2012-11-10 14 views
8

Ich weiß, dass dieser Fehler zu Tode geprügelt wurde, aber ich kann nicht scheinen, um es zur Arbeit zu bringen. Ich mein Make-Datei unten verlinkt haben:-lm Keine Verknüpfung von Math-Bibliothek in Makefile

all: gensine info cs229towav 

encode.o: encode.h encode.c 
    gcc -c encode.c 

write.o: write.c write.h 
    gcc -c write.c 

gensine.o: encode.c gensine.h gensine.c helper.c write.c 
    gcc -c gensine.c -lm 

helper.o: helper.c helper.h 
    gcc -c helper.c 

read.o: read.h read.c 
    gcc -c read.c 

info.o:read.c info.h info.c decode.c 
    gcc -c info.c 

decode.o: decode.c decode.h helper.c 
    gcc -c decode.c 

cs229towav.o: write.c read.c cs229towav.c cs229towav.h helper.c decode.c encode.c 
    gcc -c cs229towav.c -lm 

gensine: encode.o gensine.o write.o helper.o 
    gcc -o gensine encode.o gensine.o write.o helper.o -lm 

info: read.o info.o decode.o helper.o 
    gcc read.o info.o decode.o helper.o 

cs229towav: write.o read.o cs229towav.o decode.o encode.o helper.o 
    gcc -o write.o read.o cs229towav.o decode.o encode.o helper.o -lm 

Clean: 
    rm -rf *o gensine info cs229towav 

Wenn ich einen Befehl wie „make gensine“ betreibe ich mit folgendem Ergebnis zurückgekehrt bin:

>cc gensine.c -o gensine 
/tmp/ccojm09X.o: In function `encodeCsFormat': 
gensine.c:(.text+0x4b1): undefined reference to `sin' 
/tmp/ccojm09X.o: In function `encodeWavFormat': 
gensine.c:(.text+0xa39): undefined reference to `sin' 
collect2: error: ld returned 1 exit status 

Nach der Lektüre dieses ist, sagt nicht definiert Bezug auf die Sünde, Das ist mit der Mathebibliothek. Die aufgeführten Funktionen befinden sich in der Datei "encode.c", die in der Datei "gensine.c" enthalten ist.

+3

Dieses Ausgabefragment scheint nicht dem Makefile oben zu entsprechen. Sind Sie sicher, dass make das richtige Makefile abholt? – fvu

Antwort

11

Der Befehl in der Make-Datei:

gcc -o gensine encode.o gensine.o write.o helper.o -lm 

nicht den Befehl, den Sie am Ende gedruckt überein:

cc gensine.c -o gensine 

Beachten Sie auch, dass es keine -lm

Beachten Sie, dass make weiß wie man Objektdateien erstellt, so dass man das Makefile am meisten braucht. Versuchen Sie, diese (nicht vergessen, mit TABs einrücken):

.PHONY : all clean 
all = gensine info 
CFLAGS =-Wall 
LIBS = -lm 

gensine: encode.o gensine.o write.o helper.o 
     gcc -o [email protected] $^ $(LIBS) 

info: read.o info.o decode.o helper.o 
     gcc -o [email protected] $^ $(LIBS) 

cs229towav: write.o read.o cs229towav.o decode.o encode.o helper.o 
     gcc -o [email protected] $^ $(LIBS) 

clean: 
     rm -rf *.o gensine info cs229towav 

Edit:

Boddie, beachten Sie, dass Ihre Verwirrung entstand, weil Sie die Make-Datei gedacht, um ein Skript war - dh. dass Sie Ihr Skript mit dem Namen make ausgeführt haben, als Sie make gensine eingegeben haben. In der Tat make ist ein Befehl wie gcc irgendwo anders im Dateisystem (auf Linux etc, geben Sie which make, um zu sehen, wo es ist). Der Befehl make erwartet eine Eingabedatei mit den Erstellungsregeln makefile oder Makefile im aktuellen Verzeichnis. Wenn es diese Datei nicht findet, verwendet es stattdessen einige eingebaute Regeln - daher die cc gensine.c -o gensine, die nirgendwo in Ihrem Makefile ist. Wenn Sie möchten, können Sie make den Namen des Makefile (so dass es nicht die Standardnamen verwendet) mit dem -f Schalter, wie @DanielFischer in den Kommentaren beschrieben.

+0

Ich benutze die Datei, und ich bekomme den gleichen Fehler wie zuvor. Es ist auch die gleiche Ausgabe vom Compiler – boddie

+0

Wie haben Sie das Makefile aufgerufen? Haben Sie mehr als ein Makefile im Verzeichnis? –

+0

ich nannte es "make" ohne Erweiterung und dann rief ich "make gensine" – boddie