为什么Linux中没有库说明符没有错误?

我目前是一名学生,学习操作系统并使用
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中定义的内容.我现在想知道某些特定版本是否真的如此.请提供反馈.

点赞