6

我在 Fedora 17(使用 GCC)上使用 eclipse,并且我在 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);
}

谢谢你的帮忙 :)

4

2 回答 2

8

在 linux、FreeBSD(和其他一些 *nix 风格)上,您应该使用编译器选项-pthread,而不是尝试与 pthread 库链接。

对于日食

Eclipse 未配置为将 -pthread 参数放入 gcc 编译中。要解决此问题,请转到菜单:

项目 -> 属性

c/c++ 构建 -> GCC C 编译器 -> 杂项

将“-pthread”参数添加到“其他标志”的开头</p>

也去:

c/c++ 构建 -> 设置 -> GCC C 链接器 -> 库

并将“pthread”库包含到其他库中。单击应用并重建项目。Pthreads 现在必须工作。

来自man gcc

-pthread :使用 pthreads 库添加对多线程的支持。此选项为预处理器和链接器设置标志。

我在这里找到了解释

在 GCC 中,-pthread(又名 -pthreads)选项管理编译器预处理器 / 和 / 链接器以启用使用 Posix 线程的编译。预处理器将定义/启用/使用某些宏的 Posix 线程版本(或执行条件编译以启用 Posix 线程逻辑),链接器将专门链接结果对象与 libpthread

但是,-lpthread只是告诉链接器尝试解析针对 libpthread 库的任何外部引用,就像 -lm 告诉链接器尝试解析针对 libm 库的任何外部引用一样。对于 -lpthread,即使您编写了 Posix 线程代码,您的代码也可能不包含对 libpthread 的外部引用,因为尚未打开关键宏。

于 2013-02-27T15:03:31.043 回答
6

你有链接到 libpthread 吗?

$> gcc ... -lpthread
于 2013-02-27T15:04:20.760 回答