【问题标题】:Cannot link static library from Makefile无法从 Makefile 链接静态库
【发布时间】:2014-07-04 10:17:06
【问题描述】:

我构建了一个静态库。问题是我无法从我的 Makefile 链接它

TARGET  =       AR1020
CC      =       gcc
CFLAGS  =       -Wall -std=c99 -I./inc/
LINKER  =       gcc -o
LFLAGS  =       -Wall -static -I./inc/


SRCDIR  =       src
INCDIR  =       inc
OBJDIR  =       obj
BINDIR  =       bin

LIBDIR  =       ./lib
LIBFLAG =       -li2c


SOURCES         :=      $(wildcard $(SRCDIR)/*.c)
INCLUDES        :=      $(wildcard $(INCDIR)/*.h)
OBJECTS         :=      $(SOURCES:$(SRCDIR)/%.c=$(OBJDIR)/%.o)
rm              =       rm -f

$(BINDIR)/$(TARGET): $(OBJECTS)
        @$(LINKER) $@ $(LFLAGS) -L$(LIBDIR) $(LIBFLAG) $(OBJECTS)
        @echo "Linking complete!"

$(OBJECTS): $(OBJDIR)/%.o : $(SRCDIR)/%.c
        @$(CC) $(CFLAGS) -c $< -o $@
        @echo "Compiled "$<" successfully"

.PHONY: clean
clean:
        @$(rm) $(OBJECTS)
    @echo "Cleanup complete!"

.PHONY: remove
remove: clean
        @$(rm) $(BINDIR)/$(TARGET)
        @echo "Exacutable removed!"

我的树是:

|-- bin
|-- inc
|   |-- color.h
|   |-- EXT.h
|   |-- EXT.h~
|   |-- gpio_lib.h
|   `-- test.h
|-- lib
|   |-- i2c.c
|   |-- i2c.o
|   `-- libi2c.a
|-- Makefile
|-- obj
|   |-- AR1020.o
|   |-- gpio_lib.o
|   |-- gpio.o
|   `-- test.o
`-- src
    |-- AR1020.c
    |-- gpio_lib.c
    `-- libi2c.a

我想链接 libi2c.a 但我收到错误“未定义对 '.....' 的引用。如果我手动编译它:

gcc src/AR1020.c lib/libi2c.a

一切都按原样编译。有人能帮我吗?

【问题讨论】:

    标签: c linux gcc makefile static-libraries


    【解决方案1】:

    您要链接的库需要位于使用这些库中任何内容的目标文件之后,所以

    @$(LINKER) $@ $(LFLAGS) -L$(LIBDIR) $(LIBFLAG) $(OBJECTS)
    

    应该是

    @$(LINKER) $@ $(LFLAGS) -L$(LIBDIR)  $(OBJECTS) $(LIBFLAG)
    

    【讨论】:

      【解决方案2】:

      我发现了一篇关于链接库的有用文章。 http://docencia.ac.upc.edu/FIB/USO/Bibliografia/unix-c-libraries.html

      链接器依次检查每个文件。如果它是一个目标文件,它将被完全放入可执行文件中。如果它是一个库,则链接器会检查是否有任何符号在先前的目标文件中引用(即使用)但未在其中定义(即包含)在库中。如果找到这样的符号,则包含该符号的库中的整个目标文件 - 将被添加到可执行文件中。这个过程一直持续到命令行上的所有目标文件和库都被处理完为止。

      请注意,在命令行中找到的目标文件总是完全包含在可执行文件中,因此提及它们的顺序并不重要。因此,一个好的规则是始终在所有目标文件之后提及库

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-17
        相关资源
        最近更新 更多