所以我的问题是:为什么在编译命令末尾需要“ -lpthread”?
此命令为什么起作用:
gcc -o name name.c -lpthread
但这不会:
gcc -o name name.c
我在我的C代码中使用了pthread.h库。
我已经在网上寻找一些答案,但没有真正找到可以理解的答案
答案 0 :(得分:7)
pthread.h
不是一个库它只是一个头文件,它为您提供了将用于多线程的函数的声明(不是函数的实际主体)。 / p>
在编译时使用-libpthread
或-lpthread
实际上将GCC库pthread
与您的代码链接。因此,编译器标志-libLIBRARY_NAME
或-lLIBRARY_NAME
是必不可少的。
如果您没有在-l
中包含标志-lib
或LIBRARY_NAME
,则将无法使用外部库。
在这种情况下,假设您正在使用函数pthread_create
和pthread_join
,那么您会得到一条错误消息:
undefined reference to `pthread_create'
undefined reference to `pthread_join'
答案 1 :(得分:4)
-l
选项告诉链接器链接到指定的外部库(在本例中为pthread库)。
包含pthread.h允许您在代码中使用pthread库中的函数。但是,与在studio.h或stdlib.h之类的地方声明的函数不同,pthread.h中的函数的实际代码默认情况下未链接。
因此,如果您使用该库中的函数而无法使用-lpthread
,则链接阶段将失败,因为它将无法在库中找到诸如pthread_create
之类的函数。