0

我正在处理一个相当大且混乱的项目,我真的没有时间清理,我的任务是为它提供一个 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档案,它似乎包含了它应该包含的所有库和目标文件。但是,链接它仍然不起作用。

我很确定我在这里遗漏了一些明显的东西......

4

1 回答 1

0

在我看来,您的包含文件可能引用了其他包含文件。因此,您需要提供一个标志来指示这些包含文件的位置。我建议提供位置(包含所有包含文件的目录)为

INCL_DIR=/包括/目录/位置

-I并使用标志将其包含在编译阶段。例如,您的规则api.o将变为

api.o: api.c api.h
        gcc -c $(CFLAGS) -I$(INCL_DIR) $(INCLUDES_FOR_BUNCH_OF_LIBS) $< -o $@
于 2013-06-20T14:20:28.143 回答