我目前是一名学生,学习操作系统并使用
Linux作为操作系统进行练习.当我们开始使用多线程应用程序并开始使用它们时(主要只是pthread_create()和pthread_join()),这个类最常见的错误之一就是在编译它们时使用了:
gcc -Wall homework.c
代替:
gcc -Wall -lpthread homework.c
我的问题是,为什么编译器和链接器在未使用-lpthread说明符编译/链接时不会抛出错误,即使代码中使用的函数需要pthread库.我的导师似乎也不知道原因.这只是学校建立我们系统的方式吗?所有Linux环境都会发生这种情况吗?为什么没有抛出链接器错误?
最佳答案 无法重现:
#include <pthread.h>
void *thread(void *arg)
{
(void) arg;
return 0;
}
int main(void)
{
pthread_t t;
pthread_create(&t, 0, thread, 0);
return 0;
}
尝试在没有libpthread的情况下进行链接:
> gcc -Wall -o thread thread.c
/tmp/ccyyu0cn.o: In function `main':
thread.c:(.text+0x2e): undefined reference to `pthread_create'
collect2: error: ld returned 1 exit status
编辑:您可以使用nm -D检查库中定义的符号,例如:在我的情况下:
> nm -D /lib/x86_64-linux-gnu/libc.so.6 | grep pthread_create
> nm -D /lib/x86_64-linux-gnu/libpthread.so.0 | grep pthread_create
00000000000082e0 T pthread_create
(所以在libc中找不到pthread_create,但实际上在libpthread中找不到)
edit2:您声称要遵守的行为的唯一可能原因是每个默认链接的库(libc,也许是libgcc)定义了pthread_create.然后它可能仍然依赖于仅在libpthread中定义的内容.我现在想知道某些特定版本是否真的如此.请提供反馈.