在C语言中Pthread函数出现未定义的引用错误。
在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提示没有出现。
问候
admin 更改状态以发布 2023年5月24日
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进行比较——我想您是想比较线程数而不是指针吧?另外,如果您没有在某个地方递减要创建的线程数,您将最终得到一个永远创建线程的代码(或者直到您用尽句柄,具体取决于不同的线程如何调度)。