【问题标题】:Linking to static library consisting of several libraries and object files using a single header file使用单个头文件链接到由多个库和目标文件组成的静态库
【发布时间】:2013-06-17 10:44:15
【问题描述】:

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

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

【问题讨论】:

  • 所以,我决定只将目标文件放入存档中,现在它似乎按预期工作。

标签: c linker makefile static-libraries unix-ar


【解决方案1】:

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

INCL_DIR=/include/dir/location

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

api.o: api.c api.h
        gcc -c $(CFLAGS) -I$(INCL_DIR) $(INCLUDES_FOR_BUNCH_OF_LIBS) $< -o $@

【讨论】:

  • 这实际上正是$(INCLUDES_FOR_BUNCH_OF_LIBS) 的含义(我的错,应该更好地命名它)。我从不指定 gcc 的头文件,只是在哪里可以找到它们。也许我应该?
  • 而api.o 构建得很好。
  • 你也必须对 main.o 做同样的事情。
猜你喜欢
  • 2011-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-18
  • 2018-10-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多