簡體   English   中英

-lm不在makefile中鏈接數學庫

[英]-lm Not linking math library in makefile

我知道這個錯誤已被打死,但我似乎無法讓它發揮作用。 我在下面鏈接了我的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

當我運行諸如“make 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

閱讀之后,這是對sin的未定義引用,它與數學庫有關。 列出的那些函數位於“encode.c”文件中,該文件包含在“gensine.c”文件中。

makefile中的命令:

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

與最后打印的命令不匹配:

cc gensine.c -o gensine

另請注意,沒有-lm

請注意, make知道如何制作目標文件,因此您不需要大部分的makefile。 試試這個(記得用TAB縮進):

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

gensine: encode.o gensine.o write.o helper.o 
       gcc -o $@ $^ $(LIBS)

info: read.o info.o decode.o helper.o
       gcc -o $@ $^ $(LIBS)

cs229towav: write.o read.o cs229towav.o decode.o encode.o helper.o
       gcc -o $@ $^ $(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中無處cc gensine.c -o gensine 如果您願意,可以使用-f開關告訴make makefile的名稱(以便它不使用默認名稱),如注釋中所述的@DanielFischer。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM