我正在处理一个相当大且混乱的项目,我没有真正的时间来清理,我的任务是为它提供API。我要做的是将所有丑陋的东西包装在一个静态库中,然后提供一个头文件。
但是当尝试使用头文件和库构建可执行文件时,我得到了一堆"未定义的引用"错误。我想如果我提供所有的头文件就可以了,但是我真的不想这样做。
现在makefile
看起来像这样(为了简单起见略有改变):
myprog.elf : libgiant_lib.a main.o
gcc -pg -o $@ main.o -lgiant_lib
main.o : main.c
gcc -c $(CFLAGS) $(SOME_INCLUDES) $< -o $@
libgiant_lib.a : $(A_BUNCH_OF_LIBS) $(COUPLE_OF_OBJS) api.o
ar rcs $@ $^
api.o : api.c api.h
gcc -c $(CFLAGS) $(INCLUDES_FOR_BUNCH_OF_LIBS) $< -o $@
我已经检查了libgiant_lib.a
存档,它似乎包含了它应该包含的所有库和目标文件。但是,指向它的链接仍然不起作用。
在我看来,您的包含文件可能有其他包含文件的引用。因此,您需要提供一个标志来指示这些包含文件的位置。我建议提供位置(包含所有include文件的目录),如
INCL_DIR =/include/dir/位置
,并使用-I
标志将其包含在编译阶段。例如,api.o
的规则将变成
api.o: api.c api.h
gcc -c $(CFLAGS) -I$(INCL_DIR) $(INCLUDES_FOR_BUNCH_OF_LIBS) $< -o $@