【问题标题】:Order of objects in a static library静态库中对象的顺序
【发布时间】:2012-08-01 09:00:51
【问题描述】:

我有一个使用多个目标文件的 C 项目,需要按特定顺序链接这些目标文件以查找所有需要的符号。

例如这个命令可以正常工作(lib2.o 依赖于 lib1.o 等)

gcc -o my_app main.o lib1.o lib2.o lib3.o -lm

但是

gcc -o my_app main.o lib3.o lib2.o lib1.o -lm

以对“my_variable”错误的未定义引用结束。

这是一种已知行为,可以通过将这些对象添加到链接描述文件中的 GROUP 部分来解决。

现在我想将这些对象作为静态库与我的同事共享。所以...

ar -rcs mylib.a lib1.o lib2.o lib3.o
gcc -o my_app main.o mylib.a -lm

不幸的是,这会产生相同的未定义引用错误,例如以不正确的顺序指定对象。

我没有找到任何链接器或存档器选项来使其正常工作,即使我认为这个问题应该相对常见,谷歌搜索也没有解决方案。

请问有人知道解决办法吗?

问候 一月

【问题讨论】:

  • 你能显示nm -s mylib.a的输出吗

标签: gcc linker static-libraries unix-ar


【解决方案1】:

这可能是链接顺序问题。当 GNU 链接器看到一个库时,它会丢弃所有不需要的符号。它也以从左到右的顺序形式执行此操作。

最新版本的 gcc/ld 默认使用--as-needed 标志链接。

这意味着如果您在 C 文件之前编写 -lmylib.a,该库将自动被排除(测试是否需要这样的东西时,顺序很重要)

您可以使用以下任一方法解决此问题:

  1. gcc -L. -o example example.c -lmylib.a
  2. gcc -L. -Wl,--no-as-needed -o example example.c -lmylib.a

后者将--no-as-needed 传递给链接器,这将导致库仍然被链接,即使您没有从它调用任何外部函数。

【讨论】:

  • 嗨,我几乎可以肯定这是一个链接顺序问题,但这并不能解决我的问题。问题是归档在 mylib.a 中的 obj 文件依赖于同一库中的另一个 obj 文件。我知道几个库之间的循环依赖问题解决了 --start-group 选项,但情况并非如此,因为库只是一个......
  • 尝试使用ranlib 归档器而不是ar
  • 我已经试过了。 ar 的 -s 参数也应该做同样的事情,但没有成功:(
  • 谢谢,nm 解决了我的问题。我没有注意到添加到库中的文件之一已经是 .a 存档,因此链接器找不到它的对象。见http://stackoverflow.com/questions/4318906/ar-on-an-existing-a-file
【解决方案2】:

您的错误表明问题出在您的某个 lib?.o 文件中 [lib{later}.o 取决于 lib{earlier}.o]
你是如何编译它们的?
是否有任何编译警告?
自从我使用 C 以来已经有一段时间了,但我认为您需要在具有依赖关系的库中包含依赖库 - 这可能是您找不到太多对该问题的引用的原因,因为它确实不存在。

【讨论】:

猜你喜欢
  • 2019-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-02
  • 1970-01-01
  • 2015-01-13
相关资源
最近更新 更多