9

我知道这个错误已经被打死了,但我似乎无法让它发挥作用。我在下面链接了我的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 的未定义引用,它在数学库中。列出的那些函数在“gensine.c”文件中的“encode.c”文件中。

4

1 回答 1

12

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键入时命名的脚本make gensine。实际上make是一个类似于gcc文件系统中其他地方的命令(在 Linux 等上,键入which make以查看它在哪里)。该命令期望在当前目录中make找到一个包含构建规则的输入文件makefileMakefile如果它没有找到那个文件,它会使用一些内置的规则来代替 - 因此cc gensine.c -o gensinewhich 在你的 makefile 中没有。如果你愿意,你可以make用开关告诉makefile的名称(这样它就不会使用默认名称)-f,正如@DanielFischer在评论中描述的那样。

于 2012-11-10T23:04:30.910 回答