当main.c不使用pthreads时,为什么必须在main.c编译中显式链接到pthread?

Dav*_*ter 2 c shared-libraries ld icc

在Linux中,我有一个使用pthreads的共享库,而没有使用的是main.c.

libpthread.so显示在我的共享库的ldd中,这是正确的.

$ ldd libmapreduce.so.1.0 
    linux-gate.so.1 =>  (0x0067d000)
    libpthread.so.0 => /lib/libpthread.so.0 (0x0058c000)
    [...]
Run Code Online (Sandbox Code Playgroud)

但是当我编译并链接我的main.c,它不使用pthreads到我的共享库时,我看到:

$ icc -Wall -o main main.c -lmapreduce
    /opt/intel/Compiler/11.1/046/lib/ia32/libiomp5.so: undefined reference to `pthread_atfork'
Run Code Online (Sandbox Code Playgroud)

将-lpthread添加到我的编译命令,即

$ icc -Wall -o main main.c -lmapreduce -lpthread
Run Code Online (Sandbox Code Playgroud)

解析未定义的引用.

当我的main.c不使用它并且我的共享库已经链接了libpthread时,为什么我需要显式链接到libpthread?

Jar*_*Par 6

为了创建可执行文件或DLL,您需要链接程序中所有依赖项的传递闭包.因为sharedlib中的main.c链接还必须链接sharedlib的所有依赖项,其中包括pthreads.

  • 如果需要pthread的共享库已正确链接,则不应在主程序的链接命令行中使用它.我怀疑一个或多个lib与pthread符号链接被视为主程序未定义/提供,而不是引用libpthread. (6认同)