即使我包含正确的头文件,为什么会出现“未定义的引用”错误?

时间:2010-11-08 03:42:45

标签: c pthreads

当我尝试编译该程序时,它失败了:

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

void *WriteNumbers(void *threadArg)
{
    int start, stop;

    start = atoi((char *)threadArg);
    stop = start + 10;

    while (start < stop)
    {
         printf("%d\n", start++);
         sleep(1);
    }
    return 0;
}

int main(int argc, char **argv)
{
        pthread_t thread1, thread2;

        // create the threads and start the printing
        pthread_create(&thread1, NULL, WriteNumbers, (void *)argv[1] );
        pthread_create(&thread2, NULL, WriteNumbers, (void *)argv[2]);

        pthread_join(thread1, NULL);
        pthread_join(thread2, NULL);

        return 0;
}

它给了我以下错误:

tmp/ccrW21s7.o: In function `main':
pthread.c:(.text+0x83): undefined reference to `pthread_create'
pthread.c:(.text+0xaa): undefined reference to `pthread_create'
pthread.c:(.text+0xbd): undefined reference to `pthread_join'
pthread.c:(.text+0xd0): undefined reference to `pthread_join'
collect2: ld returned 1 exit status

为什么它给了我这些未定义的引用错误,即使我已经包含pthread.h,它声明了这些函数?

5 个答案:

答案 0 :(得分:25)

您可能忘记链接Pthreads库(在命令行上使用-lpthread)。

答案 1 :(得分:21)

其他人提到您没有使用-lpthread标志与pthread库链接。现代海湾合作委员会(不确定现代,我的是4.3.3)允许你只使用-pthread。从手册页:

  

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

答案 2 :(得分:3)

您需要将pthread库链接到二进制文件,如下所示:

cc -o myapp myapp.c -lpthread

答案 3 :(得分:2)

待办事项

gcc -pthread -o name filename.c (cpp)

编译程序,然后

./name

运行该程序。

答案 4 :(得分:0)

适合正在寻找csapp解决方案的人们。首先编译“ csapp.c”,然后

gcc -o filename filename.c csapp.o -lpthread