静态库中的对象顺序

时间:2012-08-03 10:06:15

标签: gcc linker static-libraries ar

我有一个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

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

我没有找到任何链接器或归档器选项来使其正常工作,即使我认为这个问题应该相对普遍,也没有googling解决方案。

请有人知道解决方案吗?

问候 扬

2 个答案:

答案 0 :(得分:3)

这可能是链接订单问题。当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
  3. 后者将--no-as-needed传递给链接器,这会导致库仍然被链接,即使您没有从中调用任何外部函数。

答案 1 :(得分:0)

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