gpt4 book ai didi

gcc - 静态库中对象的顺序

转载 作者:行者123 更新时间:2023-12-04 05:37:09 26 4
gpt4 key购买 nike

我有一个使用多个目标文件的 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”错误的 undefined reference 结束。

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

现在我想将这些对象作为静态库与我的同事共享。所以...
ar -rcs mylib.a lib1.o lib2.o lib3.o
gcc -o my_app main.o mylib.a -lm

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

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

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

问候

最佳答案

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

gcc/ld 的最新版本默认与 --as-needed 链接旗帜。

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

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

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

  • 后者通过 --no-as-needed到链接器,这将导致库仍被链接,即使您没有从中调用任何外部函数。

    关于gcc - 静态库中对象的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11793577/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com