1

可能重复:
针对 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 但这没有帮助。

输出:

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

有解决这个困境的办法吗?

4

2 回答 2

6

你原来的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末尾,以便它可以用于满足对库函数的引用,例如floor(). 目前,您的 makefile 设置$(LDFLAGS)-lm,但该变量在链接命令的开头使用。

常规变量在此内置规则中设置,因此LDFLAGS可用于(历史上)需要位于链接命令开头的选项(又称“标志”),LDLIBS并可用于需要的库在*.o目标文件之后指定。

因此,要根据您正在使用的 makefile 解决此问题,您需要-lmLDFLAGS定义的变量中删除,而是添加另一个变量定义LDLIBS

LDLIBS = -lm

(我有点过度总结了:内置规则也包含$(TARGET_ARCH)and $(LOADLIBES),但这里不感兴趣。)

于 2012-12-16T17:47:21.290 回答
1

它以错误的顺序编译,继续的方法是:

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

于 2012-12-16T11:40:15.547 回答