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

智能推荐

响应式编程实现异步RPC,提升xxl-job调度吞吐量-程序员宅基地

文章浏览阅读1.1k次。在xxl-job中,RPC即用于调度中心请求执行器执行job、kill job,也用于执行器请求调度中心主动注册、执行结果上报。xxl-job实现的RPC类似Feign框架,是基于http..._xxljob 用的什么协议

C++ Json到对象的自动序列化和反序列化工作_c++ json序列化和反序列化-程序员宅基地

文章浏览阅读555次,点赞17次,收藏22次。JSERIALIZE_DEF_OBJECTLIST(Person,Object,objectList) //接受json中的objectList对象数组,对象数组使用此宏定义。JSERIALIZE_DEF_OBJECTTYPE(Person,Son,son) //接受json中的son对象,对象成员使用此宏定义。//输出反序列化结果。

DOSBOX 0.74模拟器安装Windows 95_dosbox imgmount-程序员宅基地

文章浏览阅读7.8k次,点赞2次,收藏6次。DosBox本身带有5.0版的DOS系统,启动后虚拟一个Z盘存放有Dosbox特有的外部指令,如config.com、imgmount.com等,经测试,可以顺利安装各版本的windows 3.1系统,但是不能安装win95,需要用原版的dos镜像启动才能安装。1. 获取启动盘镜像文件 下载Win95启动软盘镜像文件,名为boot.img,放到DosBox 0.74的目录下。2. 制作硬盘镜像文件_dosbox imgmount

呼叫转移的普适性及编程实现_电话自动转移程序开发-程序员宅基地

文章浏览阅读53次。总结来说,呼叫转移是一种方便的电话通信功能,在编程中可以通过使用电话服务提供商的API来实现。然而,实际的实现可能因具体的服务提供商而有所不同,你需要参考相应的文档或与服务提供商联系以获取准确的实现细节。在函数内部,我们构建了一个API请求的有效载荷(payload),其中包含了原始电话号码和目标电话号码。在编程中,呼叫转移的实现涉及使用电话通信协议和相应的编程语言。需要注意的是,实际的呼叫转移功能的实现可能因电话服务提供商的不同而有所差异。首先,我们需要确保已经安装了Python的开发环境和相应的库。_电话自动转移程序开发

FLink聚合性能优化--MiniBatch分析_flink mini-batch-程序员宅基地

文章浏览阅读5.4k次,点赞4次,收藏15次。[@ TOC]一、MiniBatch的演进思路1、MiniBatch版本Flink 1.9.0 SQL(Blink Planner) 性能优化中一项重要的改进就是升级了微批模型,即 MiniBatch(也称作MicroBatch或MiniBatch2.0),在支持高吞吐场景发挥了重要作用。MiniBatch与早期的MiniBatch1.0在微批的触发机制略有不同。原理同样是缓存一定的数据后..._flink mini-batch

EasyExcel导入_easyexcel 对接multipartfile-程序员宅基地

文章浏览阅读808次,点赞6次,收藏6次。导入依赖<dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.1.6</version></dependency>Controllerimport java.text.ParseException;import org.springframework._easyexcel 对接multipartfile

随便推点

【EJB】异步方法调用-程序员宅基地

文章浏览阅读641次,点赞23次,收藏18次。虽然我个人也经常自嘲,十年之后要去成为外卖专员,但实际上依靠自身的努力,是能够减少三十五岁之后的焦虑的,毕竟好的架构师并不多。架构师,是我们大部分技术人的职业目标,一名好的架构师来源于机遇(公司)、个人努力(吃得苦、肯钻研)、天分(真的热爱)的三者协作的结果,实践+机遇+努力才能助你成为优秀的架构师。如果你也想成为一名好的架构师,那或许这份Java成长笔记你需要阅读阅读,希望能够对你的职业发展有所帮助。《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

如何构建知识体系_网络智能知识体系的构建方法-程序员宅基地

文章浏览阅读286次。分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请轻击http://www.captainbed.net先说一件值得思考的事情:高考的时候大家都是一样的教科书,同一个教室,同样的老师辅导,时间精力基本差不多,可是最后别人考的是清华北大或者一本,而你的实力只能考个三本,为什么?当然这里主要是智商的影响,那么其他因素呢?智商解决的问题能不能后天用其他方式来补位一下?大家平时都看过很多方法论的文章,看的时候很爽觉得非常有用,但是一两周后基本还是老样子了。其中有很大_网络智能知识体系的构建方法

超全的数组去重12种方法_数组去重方法-程序员宅基地

文章浏览阅读2.7w次,点赞33次,收藏349次。前言数组去重,可以说是一个比较常见的面试题,今天来盘点一下都有哪些方法可以实现数组去重。方法1、双重for循环这是一个最笨的方法,双重循环。var arr = [1, 2, 3,4 ,5,6, 4, 3, 8, 1] // 数组去重: // 方法1: 双重for 循环 function newArrFn (arr) { // 创建一个新的空数组 let newArr = [] for(let i = 0;i<arr.length;i+_数组去重方法

2022考研日语71分自学经验贴;日语可以自学吗?-程序员宅基地

文章浏览阅读1.2k次,点赞3次,收藏5次。目录1 个人对考研日语的评价1 日语VS英语2 考研日语适合哪些人,什么时候开始3 找到可以选日语的院校专业的方法4 高考日语自学经历(供参考)4.1 学习过程4.2 必用资料5 考研日语自学+作文课经历(供参考)5.1 资料相关5.2 完型(20分)5.3 阅读(40分)5.4 翻译(15分)5.5 作文(25分)end实在受不了英语应试的折磨,高考和考研都用了203日语替换了英语(高考127分,考研估分65-70分)1 个人对考研日语的评价我是有了高考127分的基础(大概N3水平,N2擦线水平),

JVM性能优化 (一) 初识JVM-程序员宅基地

文章浏览阅读703次,点赞22次,收藏24次。到这里文章就讲完了,有疑问的兄弟可以在下面讨论或留言,也祝大家在今年开开心心,健健康康,能够拥有一份好工作,大家加油,我是牧小农!自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

通过手动给upx去壳简单了解逆向_upx脱壳机-程序员宅基地

文章浏览阅读1.7k次。对于像我这种想入门逆向的,这种方式真的可以培养兴趣,也从中学到了很多知识,我也不会仅仅止步于脱upx的。[外链图片转存中…(img-xkCBlSoD-1693021558445)]即可。对于像我这种想入门逆向的,这种方式真的可以培养兴趣,也从中学到了很多知识,我也不会仅仅止步于脱upx的。_upx脱壳机

推荐文章

热门文章

相关标签