2012-11-10 18 views
8

Bu hatanın ölümüne dövüldüğünü biliyorum, ancak işe yaramaya gelemiyorum. Aşağıda benim makefile bağladığınız: Bir komutu çalıştırdığınızda gibi-lm Makefile içinde matematik kütüphanesi bağlanmadı

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 

aşağıdaki sonuçla döndü am "gensine yapmak": Bu okuduktan sonra

>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 

olan günah tanımsız başvuru diyor matematik kütüphanesi ile olan. Listelenen bu işlevler "gensine.c" dosyasında bulunan "encode.c" dosyasında bulunur.

+3

Bu çıktı parçası, yukarıdaki makefile karşılık gelmiyor gibi görünüyor, doğru makefile aldığınızı emin misiniz? – fvu

cevap

11

makefile komut:

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

Sonunda baskılı komutu eşleşmiyor:

da
cc gensine.c -o gensine 

Bildirim make bildiği hiçbir -lm

Not olduğunu Nesne dosyaları nasıl yapılır, böylece makefile çoğu gerekmez. Bu (sekmeleri ile girinti unutmayın) deneyin:

.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 

Düzenleme:

Boddie, sen makefile bir senaryo olduğunu düşündüm çünkü karışıklık ortaya çıktı dikkat - yani. make gensine yazdığınızda, komut dosyanızı make olarak çalıştırdığınızı. Aslında make dosya sisteminde başka bir yerde gcc gibi bir komuttur (Linux vb üzerinde, nerede olduğunu görmek için which make yazın). make komutu, geçerli dizinde makefile veya Makefile adlı yapı kurallarını içeren bir girdi dosyası bulmayı bekler. Eğer bu dosyayı bulamazsa, bunun yerine bazı yerleşik kurallar kullanır - dolayısıyla makefile hiçbir yerde olmayan cc gensine.c -o gensine. İsterseniz, make 'a, makefile adını (böylece varsayılan adları kullanmaz) -f anahtarıyla yorumlarda @DanielFischer açıklandığı gibi söyleyebilirsiniz.

+0

Dosyayı kullanıyorum ve daha önce olduğu gibi aynı hatayı alıyorum. Aynı zamanda derleyici – boddie

+0

dan aynı çıktı makefile ne dedin? Dizinde birden fazla makefile var mı? –

+0

i uzantı olmadan "make" olarak adlandırılmış ve sonra "gensine" – boddie