【问题标题】:gcc-4.8.2 doesn't link pthreadgcc-4.8.2 不链接 pthread
【发布时间】:2015-01-18 08:26:16
【问题描述】:

全部。

使用 gcc 工具链编译简单的东西几年了,今天我遇到了一个奇怪的现象。

我将 Kubuntu 14.04 安装到一台普通的桌面 i686 机器上,其中装有 gcc 4.8.2。但是后来,试图构建一些从我的本地存储库中提取的编码良好的东西,我遇到了大量的“未定义引用”消息。代码在 Ubuntu 11.04 / gcc 4.5.2 下编译、链接和运行良好。 我检查了链接过程(通过 -Wl,--verbose 到 gcc),认为它有效。它会找到我在链接命令中指定的所有库。 objdump -t myLib.so 带来的正是我所期望的符号 - 但链接器看不到它们。
检查 pthread 库也会带来相应的符号,只是它们带有一些 @GLIBC... 东西的后缀。到目前为止没有检查链接器/加载器技巧。

样例

#include <stdio.h>
#include <unistd.h>
#include <pthread.h>

static void *fooo (void *xxx) {
    char *txt = (char*)xxx;
    printf("My job is to print this :'%s'. Bye now!\n", txt);
    return 0;
 }
 int main (int argc, char *argv[]) {
    pthread_t thd;
    pthread_create(&thd,  NULL, fooo,  "A POSIX thread");
    sleep(1);
    return 0;
 }

在旧系统上运行得很好,只是说

gcc -l pthread fooo.c && ./a.out

但在与 4.8.2 的链接步骤中中断。
任何想法都会非常受欢迎。

.M

【问题讨论】:

  • 能否请您添加错误信息
  • Linker order - GCC的可能重复
  • @JoachimPileborg 我猜不是因为只有一个库链接到程序中。我们肯定需要确切的错误信息。
  • 试试 gcc -pthread -o fooo fooo.c && ./fooo 而不是 gcc -l pthread
  • @sfrehse 重要的是依赖关系的顺序,而不是如果一个库使用另一个库。文件 fooo.c 依赖于 pthread 库,因此它必须在命令行上的 -lpthread 之前。

标签: gcc linker pthreads gcc4


【解决方案1】:

感谢 sfrehse、JoachimPileborg 等人!

确实,成功取决于参数顺序。我知道静态链接的这一事实,但它在使用 gcc 处理共享对象时是新的。

有人知道这个改进的背景是什么吗?它打破了无数的构建过程,我猜成千上万的西红柿正在准备对抗 gcc.gnu.org .....

.M

【讨论】:

  • 保存你的西红柿,这是链接器而不是 GCC 的属性,从技术上讲,它是必需的 always,它只是碰巧在过去的某些情况下工作。
  • @Jonathan 错了。绝对 NOT 总是需要的。请看我最初的帖子。你会看到这种效果在 4.5.2 和 4.8.2 之间上升。甚至在古代版本上——我也运行 4.1.2——这些东西链接得很好。感谢您对链接器工作的提示。
  • 当我说“它只是碰巧在过去有效”时,“我尝试过并且有效”如何证明我错了?链接器的文档一直说库按照它们在命令行上出现的顺序搜索一次。例如远至binutils 2.9.1,请参阅-l 选项
  • btw 我认为改变的是您的发行版现在可能默认使用 --as-needed 链接器选项,这可能会影响是否拉入其他共享库以解决丢失的引用。如果您将--as-needed 传递给链接器,我相信您会得到与古代版本相同的行为。 (但同样,说明 GCC 的版本是没有意义的,因为决定这种行为的是链接器而不是 GCC。)
猜你喜欢
  • 2014-12-03
  • 1970-01-01
  • 2014-08-14
  • 2018-07-28
  • 2014-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-12
相关资源
最近更新 更多