gcc中-pthread和-lpthread的区别_-plthread是干嘛的-程序员宅基地

技术标签: shell  gcc  linux  thread  工作  c/c++  

用gcc编译使用了POSIX thread的程序时通常需要加额外的选项,以便使用thread-safe的库及头文件,一些老的书里说直接增加链接选项 -lpthread 就可以了,像这样:

Shell代码   收藏代码
  1. gcc -c x.c  
  2. gcc x.o -ox -lpthread  

 而gcc手册里则指出应该在编译和链接时都增加 -pthread 选项,像这样:

Shell代码   收藏代码
  1. gcc -pthread -c x.c  
  2. gcc x.o -ox -pthread  

 那么 -pthread 相比于 -lpthread 链接选项究竟多做了什么工作呢?我们可以在verbose模式下执行一下对应的gcc命令行看出来。下面是老式的直接加 -lpthread 链接选项的输出结果:

Shell代码   收藏代码
  1. $ gcc -v -c x.c  
  2. ...  
  3. /usr/lib/gcc/i486-linux-gnu/4.2.4/cc1 -quiet -v x.c -quiet -dumpbase x.c  
  4. -mtune=generic -auxbase x -version -fstack-protector -fstack-protector -o /tmp/cch4ASTF.s  
  5. ...  
  6. as --traditional-format -V -Qy -o x.o /tmp/cch4ASTF.s  
  7. ...  
  8. $ gcc -v x.o -ox -lpthread  
  9. ...  
  10.  /usr/lib/gcc/i486-linux-gnu/4.2.4/collect2 --eh-frame-hdr -m elf_i386 --hash-style=both  
  11. -dynamic-linker /lib/ld-linux.so.2 -ox  
  12. /usr/lib/gcc/i486-linux-gnu/4.2.4/../../../../lib/crt1.o  
  13. /usr/lib/gcc/i486-linux-gnu/4.2.4/../../../../lib/crti.o  
  14. /usr/lib/gcc/i486-linux-gnu/4.2.4/crtbegin.o  
  15. -L/opt/intel/Compiler/11.1/046/tbb/ia32/cc4.1.0_libc2.4_kernel2.6.16.21/lib/../lib  
  16. -L/usr/lib/gcc/i486-linux-gnu/4.2.4  
  17. -L/usr/lib/gcc/i486-linux-gnu/4.2.4  
  18. -L/usr/lib/gcc/i486-linux-gnu/4.2.4/../../../../lib  
  19. -L/lib/../lib  
  20. -L/usr/lib/../lib  
  21. -L/opt/intel/Compiler/11.1/046/lib/ia32  
  22. -L/opt/intel/Compiler/11.1/046/tbb/ia32/cc4.1.0_libc2.4_kernel2.6.16.21/lib  
  23. -L/usr/lib/gcc/i486-linux-gnu/4.2.4/../../..  
  24. x.o -lpthread -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc  
  25. --as-needed -lgcc_s --no-as-needed  
  26. /usr/lib/gcc/i486-linux-gnu/4.2.4/crtend.o /usr/lib/gcc/i486-linux-gnu/4.2.4/../../../../lib/crtn.o  

 下面是在编译和链接时分别指定 -pthread 选项的输出结果:

Shell代码   收藏代码
  1. $ gcc -v -pthread -c x.c  
  2. ...  
  3. /usr/lib/gcc/i486-linux-gnu/4.2.4/cc1 -quiet -v <strong>-D_REENTRANT</strong>  
  4.  x.c -quiet -dumpbase x.c  
  5. -mtune=generic -auxbase x -version -fstack-protector -fstack-protector -o /tmp/cc205IQf.s  
  6. ...  
  7. as --traditional-format -V -Qy -o x.o /tmp/cc205IQf.s  
  8. ...  
  9. $ gcc -v x.o -ox -pthread  
  10. /usr/lib/gcc/i486-linux-gnu/4.2.4/collect2 --eh-frame-hdr -m elf_i386 --hash-style=both  
  11. -dynamic-linker /lib/ld-linux.so.2 -ox  
  12. /usr/lib/gcc/i486-linux-gnu/4.2.4/../../../../lib/crt1.o  
  13. /usr/lib/gcc/i486-linux-gnu/4.2.4/../../../../lib/crti.o  
  14. /usr/lib/gcc/i486-linux-gnu/4.2.4/crtbegin.o  
  15. -L/opt/intel/Compiler/11.1/046/tbb/ia32/cc4.1.0_libc2.4_kernel2.6.16.21/lib/../lib  
  16. -L/usr/lib/gcc/i486-linux-gnu/4.2.4  
  17. -L/usr/lib/gcc/i486-linux-gnu/4.2.4  
  18. -L/usr/lib/gcc/i486-linux-gnu/4.2.4/../../../../lib  
  19. -L/lib/../lib  
  20. -L/usr/lib/../lib  
  21. -L/opt/intel/Compiler/11.1/046/lib/ia32  
  22. -L/opt/intel/Compiler/11.1/046/tbb/ia32/cc4.1.0_libc2.4_kernel2.6.16.21/lib  
  23. -L/usr/lib/gcc/i486-linux-gnu/4.2.4/../../..  
  24. x.o -lgcc --as-needed -lgcc_s --no-as-needed <strong>-lpthread</strong>  
  25.  -lc -lgcc  
  26. --as-needed -lgcc_s --no-as-needed  
  27. /usr/lib/gcc/i486-linux-gnu/4.2.4/crtend.o /usr/lib/gcc/i486-linux-gnu/4.2.4/../../../../lib/crtn.o  

 可见编译选项中指定 -pthread 会附加一个宏定义 -D_REENTRANT,该宏会导致 libc 头文件选择那些thread-safe的实现;链接选项中指定 -pthread 则同 -lpthread 一样,只表示链接 POSIX thread 库。由于 libc 用于适应 thread-safe 的宏定义可能变化,因此在编译和链接时都使用 -pthread 选项而不是传统的 -lpthread 能够保持向后兼容,并提高命令行的一致性。


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/g446868263/article/details/6857840

智能推荐

文件下载时文件后缀与contentType对应表_application/x-msdownload对应的文件类型-程序员宅基地

文章浏览阅读6.4k次,点赞2次,收藏9次。文件类型如下:".*"="application/octet-stream"".001"="application/x-001"".301"="application/x-301"".323"="text/h323"".906"="application/x-906"".907"="drawing/907"".a11"="application/x-a11""._application/x-msdownload对应的文件类型

系统更新及疑难处理-程序员宅基地

文章浏览阅读345次。系统更新及疑难处理利用WSUS部署更新程序微软公司的主要补丁类型nHotfix是针对某一个具体的系统漏洞或安全问题而发布的专门解决该漏洞或安全问题的小程序,通常称为修补程序n微软公司会及时地将软件产品中发现的重大问题以安全公告的形式公布于众,这些公告都有一个惟一的编号,即“MS”,如MS04-011n还有一种形式为KB(2003年4月份后用此编号)的编号,这个编..._允许来自internetmicrosoft更新服务位置的签名更新

【论文】ROS系统的无人小车自动跟随方案研究-程序员宅基地

文章浏览阅读3.7k次,点赞3次,收藏45次。本文基于ROS操作系统介绍了一种运动与跟随系统的设计及实现,该跟随系统包括以激光雷达进行全方位角度的距离测量,使用Python语言编写脚本,通过编写激光雷达话题的订阅以及运动话题的发布,完成对目标的运动控制以及对被跟随目标的感知和产生跟随相应的动作。本系统中无论被跟随目标位于跟随机器人的任何方位,均能实现机器人的跟随,无需额外的基站、标签等定位设施,可以减少整个跟随系统成本。基于ROS系统使开发简单快速,适用范围广,具有良好的可移植性和通用性。_ros系统的无人小车自动跟随方案研究

几十款游戏的简单分析_游戏分析-程序员宅基地

文章浏览阅读1.3k次。笔者曾在多个游戏平台上玩过众多游戏,包括fc红白游戏机游戏、网页游戏、单机游戏、客户端游戏、手游等。在游戏过程中,笔者常常从多个角度对游戏进行分析,包括游戏的优缺点、改进方法、数值设计、音效、画面等方面。本篇文章简要但关键地记录了笔者在游戏体验和策略分析方面的一些心得体会。综合以上所述,一款成功的游戏需要满足一些基本要素。首先,它必须是新颖的、有趣的、易于上手的,同时游戏数值、画面、音效等方面也要在合理区间。_游戏分析

circular waveguide_wr137 circular waveguide datasheet-程序员宅基地

文章浏览阅读1.3k次。 Figure 1 Bessel function of first kindFigure 2 Derivative of Bessel function of first kindFigure 3 E field of TE11 modeFigure 4 H field of TE11 modeFigure 5 E field w.r.t. time_wr137 circular waveguide datasheet

STM32之NB-IoT学习(一)——NB-IoT介绍_物联网lot学习(2)-程序员宅基地

文章浏览阅读892次,点赞8次,收藏13次。你的支持,我的动力;祝各位前程似锦,offer不断,步步高升!!!如果你觉得这些内容对你有帮助,可以+V:Vip1104z获取!!!(备注:嵌入式)你的支持,我的动力;祝各位前程似锦,offer不断,步步高升!!!更多资料点击此处获qu!!_nb-iot

随便推点

自建网盘之 NextCloud 终极记录-程序员宅基地

文章浏览阅读1.7k次。自建过许多网盘,试过 可道云、Seafile、FileRun、Nextcloud,但Nextcloud的如下特性吸引了我:完整、好用的客户端,包括 windows、mac、android、ios ...强大的插件扩展,如 Talk, Contacts, notes, Maps ...完整的第三方扩展,支持 Amazie S3, OneDrive, ..._可道云 nextcloud seafile

C语言最重要的知识点(复习、期末考)-程序员宅基地

文章浏览阅读1k次,点赞26次,收藏20次。C语言最重要的知识点(复习、期末考)

Windows11系统开机跳过联网全过程(详解)_跳过联网进入win11 需要设置密码-程序员宅基地

文章浏览阅读1.5k次,点赞3次,收藏7次。Windows11系统开机跳过联网全过程(详解)_跳过联网进入win11 需要设置密码

SpringBoot 整合RabbitMQ错误记录-程序员宅基地

文章浏览阅读336次。1. 控制台报错:Exception in thread "main" java.io.IOException…… Caused by: com.rabbitmq.client.ShutdownSignalException: connection error; protocol method: #method<connection.close>(r..._current message type not match with topic accept message types

【线性代数笔记】正交矩阵的性质-程序员宅基地

文章浏览阅读2w次,点赞16次,收藏81次。定义 设nnn阶矩阵AAA满足AAT=ATA=IAA^T=A^TA=IAAT=ATA=I,则称AAA为正交矩阵。定理1 设AAA,BBB是同阶正交矩阵,则:(1) det⁡(A)=±1\det(A)=\pm1det(A)=±1;(2) AT,A−1,A∗A^T,A^{-1},A^*AT,A−1,A∗均为正交矩阵;(3) ABABAB为正交矩阵。定理2 实方阵AAA为正交矩阵⟺\Longleftrightarrow⟺AAA的列/行向量组为标准正交向量组。证明提要:将AAA按列分块,考察ATA=I_正交矩阵的性质

AndroidStudio4.0 Layout界面预览设置等_android studio layout预览设置-程序员宅基地

文章浏览阅读3.9k次,点赞8次,收藏7次。这里写自定义目录标题AndroidStudio Layout和Drawable默认打开代码加预览AndroidStudio Layout和Drawable默认打开代码加预览AndroidStudio 3.6之后打开Layout和Drawable默认显示的只有预览页面,而不是代码加预览;选择File | Settings | Editor | Layout Editor可以修改默认显示代码加预览;直接上图:将右边Other Resources改成Split既可以实现代码加预览。效果如下:._android studio layout预览设置