-lm不在makefile中链接数学库

bod*_*die 8 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 -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
Run Code Online (Sandbox Code Playgroud)

当我运行诸如"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
Run Code Online (Sandbox Code Playgroud)

阅读之后,这是对sin的未定义引用,它与数学库有关.列出的那些函数位于"encode.c"文件中,该文件包含在"gensine.c"文件中.

Wil*_*ris 12

makefile中的命令:

gcc -o gensine encode.o gensine.o write.o helper.o -lm
Run Code Online (Sandbox Code Playgroud)

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

cc gensine.c -o gensine
Run Code Online (Sandbox Code Playgroud)

另请注意,没有 -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
Run Code Online (Sandbox Code Playgroud)

编辑:

Boddie,请注意你的混乱是因为你认为makefile是一个脚本 - 即.您make在键入时运行的脚本名称make gensine.事实上,这make是一个像gcc文件系统中其他地方的命令(在Linux等上,键入which make以查看它的位置).该make命令期望找到含有生成规则称为输入文件makefileMakefile在当前目录中.如果找不到该文件,则会使用一些内置规则 - 因此cc gensine.c -o gensinemakefile中没有.如果您愿意,可以make使用-f开关来告诉makefile的名称(以便它不使用默认名称),如注释中所述的@DanielFischer.

  • 将其重命名为`makefile` (3认同)