为什么 GCC 需要“-lpthread”到 link 来对抗 pthread 函数,但不需要参数到 link 来对抗其他函数?

Why does GCC require "-lpthread" to link against pthread functions but doesn't require arguments to link against other functions?

如果我使用 pthread 函数,我必须在 GCC 上使用“-lpthread”参数以确保正确链接。但是,为什么 GCC 在链接其他标准函数时不需要额外的参数?示例:printf、scanf、POSIX 套接字等

在类 UNIX 系统上,C 库的某些部分历来是在单独的共享对象中实现的。编译器驱动程序 (gcc) 仅与 -lc(和动态加载程序)隐式链接,而不是这些其他共享对象,例如 -lm(数学库)、-ldl (动态链接器/dlopen),或者在您的情况下,-lpthread。这种分离没有技术原因:musl 所有内容 放入动态加载程序(包括 -lc)。

关于 libpthread,有几个 POSIX 线程库可以与 glibc 一起使用,LinuxThreads 和 FSU Threads 是流行的。这意味着程序员可以使用适当的 -l(也许 -I)选项选择不同的线程库。

集成的 Native POSIX Threads Library (NPTL) 在集成到 glibc 后很快就取代了所有这些,因此让开发人员选择不再是一个问题。然而,在 glibc 的内部,分离成单独的对象仍然存在。在 glibc 2.34 版中,libpthread 最终也被集成到 glibc 的主要(隐式链接)对象中: