2012-11-10 16 views
8

So che questo errore è stato picchiato a morte, ma non riesco a farlo funzionare. Ho collegato il mio makefile di seguito:-lm Non collega la libreria matematica nel 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 

Quando eseguo un comando come "rendere gensine" Sono tornato con il seguente risultato:

>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 

Dopo aver letto questo è dice undefined reference al peccato, che è con la biblioteca matematica. Quelle funzioni elencate sono nel file "encode.c" che sono incluse nel file "gensine.c".

+3

Quel frammento di output non sembra corrispondere al makefile di cui sopra, sei sicuro che sta prendendo il makefile giusto? – fvu

risposta

11

Il comando nel makefile:

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

non corrisponde al comando stampato al termine:

cc gensine.c -o gensine 

Si noti inoltre che non v'è alcuna -lm

noti che make sa come creare file oggetto in modo da non aver bisogno della maggior parte del makefile. Prova questo (ricordarsi di rientrare con TAB):

.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, si noti che la vostra confusione è sorto perché pensavi il makefile era uno script - vale a dire. che stavi eseguendo lo script con il nome make quando hai digitato make gensine. Infatti make è un comando come gcc da qualche altra parte nel filesystem (su Linux ecc., Digitare which make per vedere dove si trova). Il comando make prevede di trovare un file di input contenente regole di compilazione denominate makefile o Makefile nella directory corrente. Se non trova quel file, utilizza invece alcune regole incorporate, quindi lo cc gensine.c -o gensine che non si trova da nessuna parte nel tuo makefile. Se lo desideri, puoi dire allo make il nome del makefile (in modo che non usi i nomi predefiniti) con lo switch -f, come descritto da @DanielFischer nei commenti.

+0

Io uso il file e ottengo lo stesso errore di prima. È anche lo stesso output del compilatore – boddie

+0

come hai chiamato il makefile? Hai più di un makefile nella directory? –

+0

l'ho chiamato "make" senza estensione, e poi ho chiamato "make gensine" – boddie

Problemi correlati