无法使用makefile链接math lib

时间:2012-12-16 10:30:43

标签: c gcc makefile

  

可能重复:
  Linker errors when compiling against glib…?

好的,我知道这可能是重复的,但我找不到任何其他问题的答案。 我正在尝试安装Pintos,当我在src / utils目录中运行'make'时,我得到的错误是对'floor'有一个未定义的引用。我检查了makefile,这是我得到的:

all: setitimer-helper squish-pty squish-unix
# 2207718881418

CC = gcc
CFLAGS = -Wall -W
LDFLAGS = -lm
setitimer-helper: setitimer-helper.o
squish-pty: squish-pty.o
squish-unix: squish-unix.o

clean: 
    rm -f *.o setitimer-helper squish-pty squish-unix

我尝试添加LIBS = -lm,但这没有帮助。

make的输出:

gcc -lm  setitimer-helper.o   -o setitimer-helper
setitimer-helper.o: In function `main':
setitimer-helper.c:(.text+0xbb): undefined reference to `floor'
collect2: ld returned 1 exit status
make: *** [setitimer-helper] Error 1

这种困境的任何解决方案?

2 个答案:

答案 0 :(得分:5)

您的原始makefile定义了一堆变量

CC = gcc
# etc

并列出一些依赖项

setitimer-helper: setitimer-helper.o
# etc

但除了clean规则之外,没有任何配方提供用于重新制作目标的确切命令。这意味着将使用内置的隐式规则;例如,要链接setitimer-helper,将使用以下内置规则:

$(CC) $(LDFLAGS) $^ $(LDLIBS) -o $@

对于setitemer-helper,使用相关依赖项填写自动变量:

$(CC) $(LDFLAGS) setitimer-helper.o $(LDLIBS) -o setitimer-helper

从中你可以看到剩下的变量 - $(CC)$(LDFLAGS)$(LDLIBS) - 如何填写,以便给出你看到的make的输出。

正如各位人士所指出的那样,您需要确保-lm位于link命令的 end ,以便它可用于满足对{{{}等库函数的引用。 1}}。目前,您的makefile将floor()设置为$(LDFLAGS),但该变量在link命令的开头使用。

常规变量在此内置规则中设置,以便-lm可用于(历史上)需要位于link命令开头的选项(也称为“flags”),{ {1}}可用于需要在LDFLAGS目标文件之后指定的库。

因此,要根据您使用的makefile修复此问题,您需要从已定义的LDLIBS变量中删除*.o,而是为-lm添加另一个变量定义:

LDFLAGS

(我稍微过分了:内置规则还包含LDLIBSLDLIBS = -lm ,但这些内容并不重要。)

答案 1 :(得分:2)

它的编译顺序错误,继续进行的方式是:

CC = gcc
CFLAGS = -Wall -W
LDFLAGS = -lm

myprog: myprog.o more_code.o
       ${CC} ${CFLAGS} myprog.o more_code.o ${LDFLAGS} -o myprog

myprog.o: myprog.c
       ${CC} ${CFLAGS} -c myprog.c

more_code.o: more_code.c
       ${CC} ${CFLAGS} -c more_code.c

clean:
       \rm myprog.o more_code.o myprog 

更多信息:http://www.physics.utah.edu/~p5720/rsrc/make.html

你能告诉我原始的makefile吗? 我可以试试:))

CC = gcc
CFLAGS = -Wall -W
LDFLAGS = -lm
OBJECTS = setitimer-helper.o squish-pty.o squish-unix.o

all: setitimer-helper

setitimer-helper: $(OBJECTS)
       ${CC} ${CFLAGS} $(OBJECTS) ${LDFLAGS} -o setitimer-helper

setitimer-helper.o: setitimer-helper.c
       ${CC} ${CFLAGS} -c setitimer-helper.c

squish-pty.o: squish-pty.c
       ${CC} ${CFLAGS} -c squish-pty.c

squish-unix.o: squish-unix.c
       ${CC} ${CFLAGS} -c squish-unix.c

由于您是Makefile的新手,因此最好将-Wextra -pedantic添加到CFLAGS