Linker 如何解决Makefile中的链接问题?

Linker 如何解决Makefile中的链接问题?,linker,makefile,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:

这是我的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吗


提前感谢您的回复。

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


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

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


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

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

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

本手册页为,表明其在中声明;很可能,您需要将数学库添加到链接行:-lm

我将重写您的一些makefile:

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

...

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

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

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

本手册页为,表明其在中声明;很可能,您需要将数学库添加到链接行:-lm

我将重写您的一些makefile:

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

...

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

+1.此外,all:$MAIN exec规则是不明智的;Make不承诺按照从左到右的顺序构建目标的先决条件。更好:all:exec和exec:$MAIN。@贝塔:是的,你说得对。就我个人而言,我并不特别喜欢自动执行已构建程序的makefiles,但这可能是一个老掉牙的想法。我想,这在一定程度上取决于死刑的执行情况;单元测试或回归测试是有意义的——这很可能就是这里所说的。我有很多在办公室工作的反例。而且,全部:$MAIN exec规则是不明智的;Make不承诺按照从左到右的顺序构建目标的先决条件。更好:all:exec和exec:$MAIN。@贝塔:是的,你说得对。就我个人而言,我并不特别喜欢自动执行已构建程序的makefiles,但这可能是一个老掉牙的想法。我想,这在一定程度上取决于死刑的执行情况;单元测试或回归测试是有意义的——这很可能就是这里所说的。我有很多在办公室工作的反例。