2013-02-27 52 views
5

我在Fedora 17(使用GCC)上使用eclipse,并且在pthread_create()上有一个未定义的引用,即使包含pthread.h,并且在gcc构建命令行上有-lpthread。 ..pthread库undefined参考

这里是我的代码,以防万一

void* repair() 
{ 
    int var; 
    for (var = 0; var < NB_ITER ; var += 2) 
    { 
     printf("PAIR : %d\n", var); 
    } 

return NULL; 
} // pair 

void exo03() 
{ 
    pthread_t id1; 
    pthread_create(&id1, NULL, &repair, NULL); 
} 

谢谢你的帮助:)

+1

您可能忘记了您与pthread库的链接。在你的编译命令中加上'-lpthread'作为最后一个。 – 2013-02-27 15:04:36

+0

你能提供一个完整的编译器命令+错误的例子和精确记录吗? – simonc 2013-02-27 15:05:21

回答

8

在Linux,FreeBSD(和一些其他的* nix口味),你应该使用编译器选项-pthread而不是试图与一个pthread库链接。

对于eclipse

Eclipse是未配置为把-pthread参数在GCC编译 。为了解决这个问题,转到菜单:

项目 - >属性

C/C++编译 - > GCC C编译器 - >其他

添加“-pthread”的说法到开头的“其它标志”

还请到:

C/C++编译 - >设置 - > GCCç链接 - >库

,并包括“并行线程“图书馆进入其他图书馆。点击应用并重建项目 。 Pthreads现在必须工作。

man gcc

-pthread:增加了与pthreads库支持多线程。此选项为预处理器和链接器设置标志。

我发现了一个explanation here

在GCC中,-pthread(又名-pthreads)选项,同时管理编译 预处理器/和/连接器,使编译与POSIX线程。 预处理器将定义/启用/使用POSIX线程的一些 宏版本(或执行条件编译,以使POSIX线程 逻辑),以及链接器将特异性针对的libpthread链接所得到的对象

然而,-lpthread只需告诉连接尝试解决针对libpthread库的任何 外部引用,在-lm告诉链接以尝试解决针对libm库的任何外部 引用同样的方式 。对于-lpthread,你的代码可能 不包含外部引用的libpthread,即使你写的Posix 线程的代码,因为关键的宏尚未开启。

+0

为什么不链接到libpthread? – 2013-02-27 15:05:03

+0

@ bash.d:因为没有'-pthread'选项,compîler和链接器将无法找到正确的pthread库:) – 2013-02-27 15:15:41

+0

好的,谢谢,我已经忘记了这个! – 2013-02-27 15:16:53

4

你链接到libpthread?

$> gcc ... -lpthread