【问题标题】:Creating object file from other dependent object files [duplicate]从其他依赖对象文件创建对象文件[重复]
【发布时间】:2017-05-12 01:49:33
【问题描述】:

我的文件依赖a.ca.hb.cb.hc.cc.h是这样的:

// a.c
#include "a.h"
#include "b.h"
#include "c.h"
#include <lib>

// b.c
#include "b.h"
#include <lib>

// c.c
#include "c.h"
#include <lib>

我没有main() 功能。我需要创建out.o,其他人将在他的程序中将其与 main 一起使用(他必须编写 #include "a.h" 才能使用我在那里编写的函数)。

所以我写了

gcc -std=c99 -c c.c -o c.o -llib

gcc -std=c99 -c b.c -o b.o -llib

gcc -std=c99 -c a.c -o a.o -llib

但是当我尝试将它们组合使用时

gcc -o out.o a.o b.o c.o -llib

我收到很多错误,例如relocation 18 has invalid symbol index 13,最后是undefined reference to 'main'

我怎样才能创造我需要的东西? `

【问题讨论】:

  • 您要查找的术语是静态库。搜索如何在例如创建一个Linux,您将获得很多成功。

标签: c gcc


【解决方案1】:

我想你想用你的 .o 文件创建一个库。

ar crf yourlib.a a.o b.o c.o

然后,其他人可以编译他们的程序,例如:

gcc -o main main.c yourlib.a

【讨论】:

  • 我怎样才能在这个静态库中包含lib?使用ar crf yourlib.a a.o b.o c.o -llib 不起作用
  • @ManoMini 静态库只是目标文件的集合(或档案,这就是 .a 后缀所代表的)。你不能链接一个静态库,来创建一个包含它自己所有依赖的静态库。这不是静态库的工作方式。如果您的静态库依赖于另一个库,则您的库的用户也必须与您的依赖项链接。您根本无法创建独立的静态库。
  • 如果您所说的“lib”是一个静态库,那么可以,您可以通过以下方式从您的 lib.a 中提取元素(.o 文件):ar -x lib.a。 ..那么你的目录中就会有所有这些.o。然后您可以执行上述相同操作,现在包括使用 ar -x 从 lib.a 中提取的 .o 文件列表。如果它们太多,您可以使用 *.o。
  • @zsram 没有。当你必须在 gcc 中使用 -lm 时,就像 cmath 一样
  • 例如在 linux 中,libm 存在于静态和动态版本中: $ find /usr/lib -name libm.* 该命令在我的系统中生成 libm.a 和 libm.so。也许你的库也有一个静态版本。
猜你喜欢
  • 2017-04-08
  • 2018-04-11
  • 2021-06-26
  • 2012-01-09
  • 1970-01-01
  • 2018-08-11
  • 2019-08-03
  • 2012-09-02
相关资源
最近更新 更多