我构建了一个静态库。问题是我无法从我的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
一切都按照应有的方式进行编译。有人能帮我吗?
答案 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
链接器依次检查每个文件。如果它是一个目标文件,则将其完全放入可执行文件中。如果它是一个库,则链接器将检查库中是否存在先前对象文件中引用(即使用)但未定义(即包含在其中)的任何符号。如果找到了这样的符号,则包含该符号的库中的整个目标文件都将添加到可执行文件中。这个过程一直持续到命令行上的所有目标文件和库都处理完为止。
请注意,在命令行中找到的目标文件始终完全包含在可执行文件中,因此提及它们的顺序并不重要。因此,一个好的规则是总是在所有目标文件之后提及库