【问题标题】:How to solve this linking problem in Makefile?如何解决 Makefile 中的链接问题?
【发布时间】:2010-11-25 15:13:29
【问题描述】:

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

提前感谢您的回复。

【问题讨论】:

    标签: linker makefile


    【解决方案1】:

    您基本上不应该通过直接调用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。此外,all: $(MAIN) exec 规则是不明智的; Make 不承诺按从左到右的顺序构建目标的先决条件。更好:all: execexec: $(MAIN)
    • @Beta:是的,你是对的。就个人而言,我并不特别喜欢自动执行已构建的程序的 makefile,但这可能是一个老顽固的想法。我想,这部分取决于执行的内容;单元测试或回归测试是有道理的——这很可能就是这里的情况。我有很多办公室工作的反例。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-29
      • 1970-01-01
      • 2013-05-23
      • 2014-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多