深入解释为什么我们需要在 gcc 的链接器选项中使用“-pthread”?

In-depth explanation for why we need '-pthread' in Linker option for gcc?

要使用pthread_create和其他POSIX线程库函数,我们需要这个标志。我们为什么需要这个?

为什么/usr 中没有像其他功能或其他系统调用的实现一样实现这些功能的代码?

另一个问题:此外,如果没有此标志,则会出现以下输出:ERROR

我的问题是,为什么我们在编译时会出现这些错误(对...的未定义引用)? gcc 应该生成可执行文件,并且在 运行 时间内,它应该尝试找到这些符号,对吗? (动态链接)

注意:这些符号(pthread_create、pthread_join)是外部符号(使用 -E gcc 标志在 preproc 中检查)。这与在 运行 时间加载的符号不同吗?

你的大纲是正确的,我会尝试分解你问题的每个部分并为你指出正确的方向。

To use pthread_create and other POSIX thread library functions, we need this flag. Why do we need this?

pthreads 没有作为 gcc 内置函数或 "standard" libc 的一部分实现,这意味着外部库必须实现它们。由于需要外部库,因此需要使用 -pthread 标志通知 linker 有关该外部库的信息。

Why isn't there a code in /usr that implements these functions like other functions or implementation of other system calls?

绝对有,pthread API 是在 libpthread 中实现的,您几乎肯定会在其共享 (libpthread.so)、静态 (libpthread.a) 和版本中找到它/usr/lib 文件夹中的特定 (libpthread-X.YY.so) 表格。

Also, without this flag, following output is there: ERROR

这是 linker 告诉您您没有指定 pthread 的实现供其使用。仅仅因为 glibc 提供了一个实现并不意味着它就是您打算使用的实现。 linker 不是头脑 reader,它需要在编译时被告知你想要 link 到哪些 特定 库。

My question is, why are we getting these errors (undefined reference to...) at compile time? gcc should make the executable and during run-time, it should try to find these symbols right? (Dynamic linking)

再一次,linker 需要在编译时明确它将在运行时寻找什么库。定义相同符号的两个库的 ABI 可能不相同(并且可能不会相同,除非专门设计用于)。这意味着即使您的动态 linked 代码不会携带库的静态 linked 副本,代码的二进制结构仍然取决于库依赖性。因此必须在编译时知道此信息。

NOTE: These symbols (pthread_create, pthread_join) are extern (checked in preproc using -E gcc flag). Is that different from symbols loaded at run-time?

不,extern 只是通知编译器某个符号不会在给定的编译单元中定义。如果这没有意义,它基本上意味着,"that symbol is defined in another file, I'm just using it here".