2012-11-10 99 views
8

我知道這個錯誤已被打死,但我似乎無法讓它工作。我已經聯繫我下面的生成文件:-lm不在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 

當我運行一個命令,如「讓gensine」我用下面的返回結果:

>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 

看完這個是說未定義的引用罪,這是與數學圖書館。列出的這些功能位於「gensine.c」文件中包含的「encode.c」文件中。

+3

該輸出片段似乎不對應上面的makefile,你確定make是在拾取正確的makefile嗎? – fvu

回答

11

Makefile中的命令:

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

不匹配,你在最後打印的命令:

cc gensine.c -o gensine 

還要注意的是,沒有-lm

注意make知道如何製作目標文件,這樣你就不需要大部分的makefile。試試這個(記得製表符縮進):

.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 

編輯:

Boddie,請注意你的困惑的出現是因爲你覺得makefile文件是一個腳本 - 即。當您鍵入make gensine時,您正在運行名爲make的腳本。事實上,make是一個像gcc這樣的命令,在文件系統的其他地方(在Linux等上,鍵入which make以查看它在哪裏)。 make命令期望在當前目錄中找到包含構建規則的輸入文件,該構建規則稱爲makefileMakefile。如果它找不到該文件,則它會使用一些內置規則 - 因此cc gensine.c -o gensine在makefile中不存在。如果您願意,您可以使用-f開關將生成文件的名稱(以便它不使用默認名稱)告知make,如註釋中所述的@DanielFischer。

+0

我使用該文件,並得到與以前相同的錯誤。它也是編譯器的相同輸出 – boddie

+0

你叫做makefile的是什麼?我在目錄下有多個makefile文件嗎? –

+0

我將它命名爲「make」,沒有擴展名,然後我打電話給「make gensine」 – boddie