C 何时需要显式链接到pthreads?

C 何时需要显式链接到pthreads?,c,linux,gcc,pthreads,shared-libraries,C,Linux,Gcc,Pthreads,Shared Libraries,我正在构建一个依赖于pthreads的共享库。构建库时是否需要显式链接到pthreads?我发现即使我没有链接到pthreads,它似乎也可以正常工作——无论是在库中还是在使用它的程序中 为了测试,我尝试了这个小测试程序: #include <stdio.h> #include <pthread.h> int main (int argc, char **argv) { int cs; pthread_setcancelstate(PTHREAD_CANCEL_

我正在构建一个依赖于pthreads的共享库。构建库时是否需要显式链接到pthreads?我发现即使我没有链接到pthreads,它似乎也可以正常工作——无论是在库中还是在使用它的程序中

为了测试,我尝试了这个小测试程序:

#include <stdio.h>
#include <pthread.h>

int main (int argc, char **argv)
{
  int cs;
  pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &cs);
  printf("done\n");
  return 0;
}

那么什么时候/为什么要显式链接到pthread?

如果使用POSIX线程功能,那么应该链接到libpthread。根据工具链的配置,编译器驱动程序可能会自动将
-lpthread
传递给链接器。不过,这可能不是可移植的。但是如果gcc自动传递
-lpthread
,那么当我使用
ldd
时,我是否应该看到pthread依赖关系?这很公平。我必须考虑一下,第一种情况下的目标代码中是否还有对线程函数的引用?C库中是否实际存在pthread支持,因此
-lpthread
是不必要的,但无害的?
测试
可执行文件上的@JonathanLeffler readelf-s显示了对pthread\u setcancelstate的引用。让我困惑的是-lpthread确实起到了作用(请参见输出fo
ldd
),但这两个选项都起作用。
$ gcc test.c -o test 
$ ldd test
    linux-vdso.so.1 =>  (0x00007fffd97ff000)
    libc.so.6 => /lib/libc.so.6 (0x00007f3d0d936000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f3d0dce1000)
$ ./test
done
$
$ gcc test.c -o test -lpthread
$ ldd test
    linux-vdso.so.1 =>  (0x00007fff6518b000)
    libpthread.so.0 => /lib/libpthread.so.0 (0x00007fc0daf68000)
    libc.so.6 => /lib/libc.so.6 (0x00007fc0dabdf000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fc0db1a7000)
$ ./test
done