gcc中-pthread和-lpthread的区别

Linux——gcc/g++编译器 Linux ——gcc/g++的编译链接过程,目标文件对动静态链接方式,动静态库的区别 阅读详情

最近在使用linux mint15,里面自带的gcc时4.7的,当我编译多线程程序时,使用-lpthread居然说没有找到线程库函数!!!然后man了一下,才发现在gcc 4.7中链接线程库使用-pthread,而不是用-lpthread,为了搞清楚他们之间的区别,我进行了以下测试(测试方法我查找了好多网上的资料):

用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 能够保持向后兼容,并提高命令行的一致性。

gcc 中-pthread和-lpthread的区别 -pthread 和-lpthread区别就是少了个l, 教材都是在编译的链接的时候要求加下-lpthread 解决链接的问题 gcc的官方说明是 -pthread Define additional macros required for using the POSIX threads library. You should use this option consistently for both compilation and linking. This option is supported on 阅读详情

相关推荐

Linux程序中使用lpthread对程序正确性的影响

通过使用lpthread库提供的同步机制和线程间通信机制,我们可以避免数据竞争、竞态条件和线程间的不一致问题。在上述示例代码中,我们使用了lpthread库提供的条件变量(pthread_cond_t)和互斥锁(pthread_mutex_t)来实现生产者和消费者模型的线程间通信。通过正确使用条件变量和互斥锁,我们可以确保生产者和消费者线程之间的顺序执行,并避免竞态条件和数据不一致的问题,从而保证程序的正确性。一旦收到条件信号,消费者线程被唤醒,重新获取互斥锁,从而实现线程间的通信和协调。

PixelInk的博客 453

线程(二):线程的使用(-lpthread)+创建+退出+回收

线程使用第三方库函数,在使用线程的函数时首先要安装线程函数相关的man手册。//man手册可以使用进程命令ps -ajx 查看多线程状态当进程运行状态中含有 l 的时候说明是多线程状态,l是进程的附加状态。

m0_52864526的博客 1026

决策规划算法四:Piecewise Jerk Path Optimizer

一,问题分析 路径规划的本质目的:规划出一条安全(无碰撞),舒适(平滑),符合车辆运动学的轨迹。 如下图所示,决策算法开辟凸空间后,路径规划算法用数值优化的方法搜索出一条最优路径,即将问题转化为二次规划的问题,采用二次规划的求解器进行求解。 二次规划问题的求解顺序: 1,确定优化变量 2,确定目标函数 3,确定约束条件 4,将目标函数和约束条件变形为二次规划的标准形式 5,用二次规划求解器进行求解,获得优化变量的序列,使得目标函数取得最小值。 注:路径的最终表达式为:,..

肥嘟嘟的左卫门 8562

-lpthread和-pthread的区别

编译程序包括 预编译, 编译,汇编,链接,包含头文件了,仅能说明有了线程函数的声明, 但是还没有实现, 加上-lpthread是在链接阶段,链接这个库。pthread是动态库,需要用-lpthread,所有的动态库都需要用-lxxx来引用用gcc编译使用了POSIX thread的程序时通常需要加额外的选项,以便使用thread-safe的库及头文件,一些老的书里说直接增加链接选项 -lpthre...

孤独行者的专栏 2万+

WandB本地部署踩坑指南:从Docker启动到License更新的完整流程(附常见错误解决方案)

本文详细介绍了Weights & Biases(WandB)机器学习实验管理平台的本地化部署全流程,涵盖从Docker环境搭建、许可证管理到常见错误排查的实战经验。针对企业级应用场景,文章还提供了性能优化、高可用架构设计及开源替代方案Trackio的评估与迁移策略,为构建安全、可控的内部实验追踪平台提供完整解决方案。

potato的博客 568

使用TBtools进行物种间共线性分析

Sequence Toolkit ---Fasta Tools ----ID Prefix (fasta文件)

sunny_dayone的博客 8751

gcc的基本使用

gcc的基本使用方法

Balaam' s blogs 2万+

计算图像哈希SHA-512

上述需要将lena.jpg放在当前目录下。

计算机视觉之光 961

gcc -lpthread和gcc -pthread的区别

原文链接:http://blog.chinaunix.net/uid-25909722-id-3026989.html 在编译下面的代码时,碰到了undefined reference to `pthread_atfork'的错误: 代码来自《POSIX多线程程序设计》 /*  * atfork.c  * Demonstrate the use of "fork

当今明月的专栏 1600

CloudCompare 二次开发(9)——半径滤波

基于PCL对CloudCompare软件进行二次开发,实现的算法功能是半径滤波

点云侠的博客 1401

从零开始学习AI人工智能本体论:概念与实战

本文旨在为初学者提供一个全面而易于理解的人工智能本体论入门指南。我们将覆盖从基本概念到实际应用的全过程,帮助读者理解本体论在AI系统中的核心作用。核心概念与联系:介绍本体论的基本概念和原理核心算法与操作步骤:详细讲解本体构建和推理方法项目实战:通过实际案例展示本体论的应用实际应用场景:探讨本体论在不同领域的应用未来发展趋势:展望本体论在AI领域的前景本体论(Ontology): 在AI中,指对特定领域概念及其关系的明确形式化描述。

AI智能探索者的博客 868

【Linux】gcc -pthread与gcc -lpthread的区别

当我们使用线程包(pthread)内的函数时,直接用gcc编译一定会出现如下的报错信息: [admin@localhost day0720]$ gcc create.c /tmp/ccnWXVkV.o: In function `main': create.c:(.text+0x49): undefined reference to `pthread_create' collect2: ld...

lxf_style的博客 1967

AI处理器组合

编号0-3的处理器处于同一个链路中,编号4-7的处理器处于另外一个链路中,不通链路中的处理器不能通信,如下图所示。- 如果申请处理器个数为1,则选择同一链路,剩余可用的处理器数量为1个的最佳,其次是剩余3个的为次佳,然后是剩余2个,最后是剩余4个。输出为组合列表,当array=[0, 1, 4, 5, 6, 7] ,num=1时,输出为[[0], [1]]- 如果申请处理器个数为2,则选择同一链路剩余可用的处理器数量2个的为最佳,其次是剩余4个,最后是剩余3个。任务申请1个处理器。

面试高手的博客 1万+

gcc:-pthread和-lpthread的区别

可见编译选项中指定 -pthread 会附加一个宏定义 -D_REENTRANT,该宏会导致 libc 头文件选择那些thread-safe的实现;由于 libc 用于适应 thread-safe 的宏定义可能变化,因此在编译和链接时都使用 -pthread 选项而不是传统的 -lpthread 能够保持向后兼容,并提高命令行的一致性。最近在使用linux mint15,里面自带的gcc时4.7的,当我编译多线程程序时,使用-lpthread居然说没有找到线程库函数!

Taopper的博客 1645

SMMU软件指南SMMU编程之流表(Stream Table)

SMMU使用一组内存中的数据结构来定位翻译数据,详见“转换过程概述”(Translation process overview)。SMMU_(*_)STRTAB_BASE 存储初始结构(流表,Stream Table)的基地址。流表项(Stream Table Entry, STE)包含二级(Stage 2)转换表的基址指针,同时也定位一级(Stage 1)配置结构,这些配置结构包含转换表的基址指针。 传入事务的 StreamID,由 SEC_SID 进行限定,决定了用于查找的流表,并定位相应的STE。

AI-安全-功耗 1189

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

关于gcc中-pthread和-lpthread的区别

对于常用的gcc参数来说,很多文章都有提到过,但是对于-pthread和-lpthread却很少涉及到,下面这篇文章对于两者的差别进行了详细的说明,可以参考一下 文章链接:关于gcc中-pthread和-pthread的区别 ...

M1626559435的博客 1097

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

转载_gcc -lpthread和gcc -pthread的区别

用gcc编译使用了POSIX thread的程序时通常需要加额外的选项,以便使用thread-safe的库及头文件,一些老的书里说直接增加链接选项 -lpthread 就可以了,像这样: Shell代码   gcc -c x.c   gcc x.o -ox -lpthread    而gcc手册里则指出应该在编译和链接时都增加 -pthread 选项,像这样:

williamwanglei的专栏 772

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

上一篇: 信号量的简单使用
下一篇: 线程实现生产者消费者实验
createchance
博客等级 码龄15年 156粉丝 90原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值