无法从Makefile链接静态库

时间:2014-07-04 10:17:06

标签: c linux gcc makefile static-libraries

我构建了一个静态库。问题是我无法从我的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,但我收到错误&#34;未定义引用&#39; .....&#39;。如果我手动编译它:

gcc src/AR1020.c lib/libi2c.a

一切都按照应有的方式进行编译。有人能帮我吗?

2 个答案:

答案 0 :(得分:8)

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

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

应该是

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

答案 1 :(得分:0)

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

  

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

     

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