gcc-4.8.2没有';t链接pthread

gcc-4.8.2没有';t链接pthread,gcc,linker,pthreads,gcc4,Gcc,Linker,Pthreads,Gcc4,全部 使用gcc工具链编译简单的东西已经好几年了,今天我遇到了一个奇怪的现象 我将Kubuntu 14.04安装到一台通用桌面i686机器上,其中包含gcc 4.8.2。但是,当我试图构建一些从本地存储库中提取的代码良好的东西时,我遇到了大量的“未定义的引用”消息。代码在Ubuntu 11.04/gcc 4.5.2下编译、链接和运行良好。 我检查了链接过程(by-Wl,--verbose-to-gcc),认为它可以工作。它查找我在link命令中指定的所有库。objdump-t myLib.so带

全部

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

我将Kubuntu 14.04安装到一台通用桌面i686机器上,其中包含gcc 4.8.2。但是,当我试图构建一些从本地存储库中提取的代码良好的东西时,我遇到了大量的“未定义的引用”消息。代码在Ubuntu 11.04/gcc 4.5.2下编译、链接和运行良好。 我检查了链接过程(by-Wl,--verbose-to-gcc),认为它可以工作。它查找我在link命令中指定的所有库。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;
 }
#包括
#包括
#包括
静态void*fooo(void*xxx){
char*txt=(char*)xxx;
printf(“我的工作是打印:'%s'。再见!\n”,txt);
返回0;
}
int main(int argc,char*argv[]){
pthread_t thd;
pthread_创建(&thd,NULL,fooo,“一个POSIX线程”);
睡眠(1);
返回0;
}
在旧系统上运行得很好

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

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


.M

感谢sfrehse、JoachimPileborg等人

事实上,成功取决于论证顺序。对于静态链接,我知道这一点,但在使用gcc处理共享对象时,这是一个新概念

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


.M

您能否添加错误消息@JoachimPileborg的可能重复项?我想不会,因为只有一个库链接到程序中。我们确实需要确切的错误消息。只需尝试gcc-pthread-oofooo.c&./fooo而不是gcc-lpthread@sfrehse重要的是依赖项的顺序,而不是一个库使用另一个库。文件
fooo.c
依赖于
pthread
库,因此它必须位于命令行上的
-lpthread
之前。请保存您的番茄,这是链接器的属性,而不是GCC,从技术上讲,它是必需的,只是在过去的某些情况下碰巧起作用。@Jonathan错了。这绝对不是必须的。请看我最初的帖子。你会看到这个效应在4.5.2和4.8.2之间上升。即使在古老的版本上——我也运行4.1.2——这些东西的链接也相当好。谢谢你关于链接器工作的提示。当我说“它只是碰巧在过去工作”时,“我试过了,它工作了”如何证明我错了?链接器的文档总是说库会按照它们在命令行中出现的顺序搜索一次。e、 g.早在,请参阅
-l
选项顺便说一句,我认为您的发行版现在可能默认使用
-as-needed
链接器选项,这可能会影响是否拉入其他共享库以解决缺少的引用。我相信,如果您将
--根据需要
传递给链接器,您将获得与古代版本相同的行为。(但同样,声明GCC的版本毫无意义,因为是链接器决定了这种行为而不是GCC。)