静态库中对象的顺序



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

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

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

有人知道解决办法吗?

问候一月

这可能是链接顺序问题。当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传递给链接器,这将导致库仍然被链接,即使您没有从中调用任何外部函数。

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

相关内容

  • 没有找到相关文章

最新更新