2

我有一个使用多个目标文件的 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

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

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

请问有人知道解决方案吗?

问候简

4

2 回答 2

3

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

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

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

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

  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给链接器,这将导致库仍然被链接,即使您没有从它调用任何外部函数。

于 2012-08-03T10:36:49.253 回答
0

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

于 2012-08-03T10:16:28.417 回答