在C语言中Pthread函数出现未定义的引用错误。

7 浏览
0 Comments

在C语言中Pthread函数出现未定义的引用错误。

这个问题已经在其他地方有了答案:

可能重复:

undefined reference to pthread_create in linux (c programming)

我正在尝试在Ubuntu上用C实现线程链。 当我编译以下代码时,尽管我已添加了头文件,但我仍然得到这些线程库函数的未定义引用错误。 我还遇到了分段错误。为什么会这样? 我在程序中没有访问未初始化的内存。以下是代码:

#include 
#include
#include 
void* CreateChain(int*);
 int main()
{
int num;
pthread_t tid;
scanf("Enter the number of threads to create\n %d",&num);
pthread_create(&tid,NULL,CreateChain,&num);
pthread_join(tid,NULL);
printf("Thread No. %d is terminated\n",num);
return 0;
}
void* CreateChain(int* num )
 {
pthread_t tid;
if(num>0)
{
    pthread(&tid,NULL,CreateChain,num);
    pthread_join(tid,NULL);
    printf("Thread No. %d is terminated\n",*num);
}
else
    return NULL; 
return NULL;
}

我得到以下警告,并且由于某种原因,Scanf提示没有出现。

\"enter

问候

admin 更改状态以发布 2023年5月24日
0
0 Comments

尝试像下面这样编译:

gcc -Wall -pthread test.c -o test.out

-pthread 是一个选项,明确告诉链接器解析与 相关的符号。

0
0 Comments

pthread.h头文件提供了对pthread函数的前向声明。这告诉编译器这些函数存在且具有特定的签名。然而,它并没有告诉链接器有关在运行时在哪里找到这些函数的信息。

为了让链接器解析这些调用(决定在您的代码内部或不同共享对象中跳转到哪里),您需要通过添加

-pthread

到您的构建命令行来链接相应的(pthread)库。

【请注意,也可以使用-lpthread前面的问题解释了为什么-pthread更可取。】

代码还有其他问题,值得注意

  • scanf行应该分成printf("Enter number of threads\n");scanf("%d", &num);以显示用户提示
  • CreateChain 的签名是错误的——它应该取一个void*参数。您总可以在函数内部执行int num = *(int*)arg;之类的操作以检索线程的数量。
  • CreateChain 内的逻辑看起来不正确。您现在将指针与0进行比较——我想您是想比较线程数而不是指针吧?另外,如果您没有在某个地方递减要创建的线程数,您将最终得到一个永远创建线程的代码(或者直到您用尽句柄,具体取决于不同的线程如何调度)。
0