C -lm未链接makefile中的数学库

C -lm未链接makefile中的数学库,c,unix,gcc,makefile,C,Unix,Gcc,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 -

我知道这个错误已经被打死了,但我似乎无法让它发挥作用。我已将我的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”文件中列出了这些函数。

makefile中的命令:

gcc -o gensine encode.o gensine.o write.o helper.o -lm
与最后打印的命令不匹配:

cc gensine.c -o gensine
还请注意,没有
-lm

请注意,
make
知道如何生成对象文件,因此不需要大部分makefile。尝试以下操作(请记住使用制表符缩进):

编辑:


Boddie,请注意,您的困惑是因为您认为makefile是一个脚本-即,当您键入
make gensine
时,您正在运行名为
make
的脚本。事实上,
make
是一个类似于文件系统中其他地方的
gcc
的命令(在Linux等系统上,键入
,它使
查看它在哪里)。
make
命令期望在当前目录中找到包含名为
makefile
makefile
的生成规则的输入文件。如果找不到该文件,它将使用一些内置规则,因此
cc gensine.c-o gensine
在makefile中不存在。如果愿意,可以使用
-f
开关告诉
make
生成文件的名称(这样它就不会使用默认名称),如@DanielFischer在注释中所述。

输出片段似乎与上面的生成文件不对应,您确定是否选取了正确的生成文件?我使用该文件,我得到了和以前一样的错误。它也是来自编译器的相同输出您调用了什么makefile?你在目录中有多个makefile吗?我把它命名为“make”,没有扩展名,然后我把它命名为“makegensine”omgwow!!我没有意识到名字在那里很重要。非常感谢你@boddie或称之为
make-f make gensine
。如果为makefile指定了非标准名称,则必须告诉
make
要使用哪个文件。在你的例子中,由于没有找到一个标准名称,它使用了一个烘焙规则,oops。
.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