c/c++语言开发共享当main.c不使用pthreads时,为什么必须在main.c编译中显式链接到pthreads?

在Linux中,我有一个使用pthreads的共享库和没有的。

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?

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

    感谢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可以解决问题。

      以上就是c/c++开发分享当main.c不使用pthreads时,为什么必须在main.c编译中显式链接到pthreads?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/559653.html

      (0)
      上一篇 2021年1月27日
      下一篇 2021年1月27日

      精彩推荐