我在Fedora 17上使用eclipse(使用GCC)并且我在pthread_create()上有一个未定义的引用,即使包含pthread.h并且我在gcc构建命令行上有-lpthread ...
这是我的代码,以防万一
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);
}
感谢您的帮助:)
答案 0 :(得分:8)
在linux,FreeBSD(和其他一些* nix版本)上你应该使用编译器选项-pthread
而不是尝试链接到pthread库。
Eclipse未配置为将-pthread参数放在gcc中 汇编。要解决此问题,请转到菜单:
项目 - &gt;特性
c / c ++ build - &gt; GCC C编译器 - &gt;其它
将“-pthread”参数添加到“Other Flags”的开头
也请转到:
c / c ++ build - &gt;设置 - &gt; GCC C Linker - &gt;图书馆
将“pthread”库包含在其他库中。单击“应用并重建” 该项目。 Pthreads现在必须工作。
来自man gcc:
-pthread:使用pthreads库添加对多线程的支持。此选项为预处理器和链接器设置标志。
我找到了explanation here:
在GCC中, -pthread (又名-pthreads)选项管理编译器 preprocessor /和/ linker,用于启用Posix线程的编译。 预处理器将定义/启用/使用某些Posix线程版本 宏(或执行条件编译以启用Posix线程 逻辑),链接器将专门链接结果对象 反对libpthread
但是, -lpthread 只是告诉链接器尝试解析任何问题 对libpthread库的外部引用,以相同的方式 -lm告诉链接器尝试解析任何外部 对libm库的引用。对于-lpthread,您的代码可能会 即使您编写了Posix,也不包含对libpthread的外部引用 线程代码,因为关键宏尚未打开。
答案 1 :(得分:4)
您是否已链接到libpthread?
$> gcc ... -lpthread