好的,我知道这可能是重复的,但我找不到任何其他问题的答案。 我正在尝试安装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
这种困境的任何解决方案?
答案 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
(我稍微过分了:内置规则还包含LDLIBS
和LDLIBS = -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