在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)
[...]
但是当我编译并将不使用pthreads的main.c链接到我的共享库时,我看到了:
$ icc -Wall -o main main.c -lmapreduce
/opt/intel/Compiler/11.1/046/lib/ia32/libiomp5.so: undefined reference to `pthread_atfork'
将-lpthread添加到我的编译命令,即
$ icc -Wall -o main main.c -lmapreduce -lpthread
解析未定义的引用。
当我的main.c不使用它并且我的共享库已经链接了libpthread时,为什么我需要显式链接到libpthread?
答案 0 :(得分:6)
为了创建可执行文件或DLL,您需要链接程序中所有依赖项的传递闭包。因为sharedlib中的main.c链接还必须链接sharedlib的所有依赖项,其中包括pthreads。
答案 1 :(得分:0)
谢谢R ..和Pavan Manjunath鼓励我继续挖掘。
共享库libmapreduce.so的链接步骤如下所示:
icc -shared -g -o libmapreduce.so.1.0 map.o map_wrp.o -openmp [...] -lpthread -ldl
不需要-openmp链接标志,实际上引入了对pthread_atfork的未定义引用。在我尝试将main.c与共享库libmapreduce.so链接之前,未显示对pthread_atfork的未定义引用。在没有-openmp标志的情况下重新创建libmapreduce.so可以解决问题。