如何在Makefile中解决这个链接问题?

时间:2010-11-25 15:13:30

标签: linker makefile

这是我的Makefile:

DIR=..
ARG=$(QUERY_STRING)

MAIN=main

SRC_DIR=$(DIR)/src
BIN_DIR=$(DIR)/bin
INC_DIR=$(DIR)/inc
LIB_DIR=$(DIR)/lib

LIBS=markdown

all: $(MAIN) exec


$(MAIN): $(MAIN).o
    $(LD) $^ -L $(LIB_DIR) -l $(LIBS) -o $(BIN_DIR)/$@

$(MAIN).o: $(SRC_DIR)/$(MAIN).c
    $(CC) $^ -I $(INC_DIR) -o $@

exec:
    $(BIN_DIR)/$(MAIN) $(ARG)

clean:
    rm -f *.o core.* $(BIN)/$(MAIN)

它清楚地定义了我的项目是如何组织的,所以我不会解释它。它确实编译没有任何问题,但在二进制执行$(BIN_DIR)/$(MAIN)时出现以下错误:

../bin/main: error while loading shared libraries: rintf: cannot open shared object file: No such file or directory
make: *** [exec] Error 127

rintf属于哪个库?我也尝试链接-lc,但这并不能解决问题。

我的Makefile有问题吗?或者我应该将额外的内容链接到$(MAIN)

提前感谢您的回复。

2 个答案:

答案 0 :(得分:3)

您基本上不应该通过直接调用ld链接程序;总是使用你的编译器来进行链接。它将各种额外的参数传递给ld以使事情有效。将$(LD)替换为$(CC)。无论是否真正解决了您的问题,都要这样做。

'奇怪的是,您没有获得错误消息中指定的共享对象的名称。

rintf()的此手册页表明它已在<math.h>中声明;最有可能的是,您需要将数学库添加到链接行:-lm

我会重写你的一些makefile:

LIB1    = -lmarkdown
LIB2    = -lm
LIBS    = $(LIB1) $(LIB2)
LDFLAGS = -L $(LIB_DIR)

...

$(MAIN): $(MAIN).o
    $(CC) $^ $(LDFLAGS) $(LIBS) -o $(BIN_DIR)/$@

答案 1 :(得分:1)

通常,当链接器无法找到所需的共享对象(.so文件)时会出现此错误。我假设是Linux平台。

在Linux OS中,您可以使用findlocate搜索文件。如果可以找到.so文件,请尝试使用ldconfig更新链接器缓存。如果它不起作用,请检查/etc/ld.conf.d/下的链接器配置文件以查看是否包含库路径。如果您更改了配置,请不要忘记再次更新缓存!