为什么 GCC 需要“-lpthread”来链接 pthread 函数,但不需要参数来链接其他函数?

Izz*_*zzo 2 gcc glibc pthreads linker-errors

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

Flo*_*mer 5

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

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

集成的本机 POSIX 线程库 (NPTL)在集成到 glibc 后不久就取代了所有这些线程,因此允许开发人员进行选择不再是问题。然而,在 glibc 内部,分割成单独的对象仍然存在。在 glibc 版本 2.34 中,libpthread最终也集成到 glibc 的主要(隐式链接)对象中: