【问题标题】:Why does GCC require "-lpthread" to link against pthread functions but doesn't require arguments to link against other functions?为什么 GCC 需要“-lpthread”来链接 pthread 函数,但不需要参数来链接其他函数?
【发布时间】:2022-01-21 15:55:51
【问题描述】:

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

【问题讨论】:

    标签: gcc pthreads linker-errors glibc


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-28
      • 2012-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-14
      相关资源
      最近更新 更多