代码之家  ›  专栏  ›  技术社区  ›  Rizo

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

  •  1
  • Rizo  · 技术社区  · 15 年前

    这是我的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 回复  |  直到 15 年前
        1
  •  3
  •   Jonathan Leffler    15 年前

    本质上,您不应该通过调用 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)/$@
    
        2
  •  1
  •   Khaled    15 年前

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

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