用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的区别相关推荐

  1. 区别gcc中的-w -W和-Wall选项

    区别gcc中的-w -W和-Wall选项 man 举例: man -w的意思是关闭编译时的警告,也就是编译后不显示任何warning,因为有时在编译之后编译器会显示一些例如数据转换之类的警告,这些警告 ...

  2. 【原创】多线程应用中pthread库使用问题

    2019独角兽企业重金招聘Python工程师标准>>> 在 linux 下开发多线程应用,大多情况下我们都会使用 pthread (即 POSIX thread)这个库.该库遵循 P ...

  3. Linux中线程和进程的区别

    Linux中线程和进程的区别 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,它是系统进行资源分配和调度的一个独立单位.例如,用户运行自己的程序,系统就创建一个进程,并为它分配资源,包括 ...

  4. GCC中的弱符号与强符号

    转载自 https://www.cnblogs.com/kernel_hcy/archive/2010/01/27/1657411.html 我们经常在编程中碰到一种情况叫符号重复定义.多个目标文件中 ...

  5. linux编译有线程的文件要加什么参数,Linux多线程实例,在编译中要加 -lpthread参数...

    问题: undefined reference to 'pthread_create' undefined reference to 'pthread_join' 问题原因: pthread 库不是 ...

  6. linux 中-ldl和-lpthread 是什么意思?

    在<Using the GNU Compiler Collection>gcc 4.30 中关于-lpthread的描述如下: -pthread Add support for multi ...

  7. gcc编译器与g++编译器的区别

    gcc与g++编译器的程序文件分别为:/usr/bin/g++和/usr/bin/gcc. gcc 和 GCC 是两个不同的东西,GCC:GNU Compiler Collection(GUN 编译器 ...

  8. [转] GCC 中的编译器堆栈保护技术

    以堆栈溢出为代表的缓冲区溢出已成为最为普遍的安全漏洞.由此引发的安全问题比比皆是.早在 1988 年,美国康奈尔大学的计算机科学系研究生莫里斯 (Morris) 利用 UNIX fingered 程序 ...

  9. gcc -I -i -L -l 参数区别 / -l(静态库/动态库)

    介绍 gcc   - 参数 -I ( i 的大写)  :指定头文件路径(相对路径或觉得路径,建议相对路径) -i               :指定头文件名字 (一般不使用,而是直接放在**.c 文件 ...

最新文章

  1. 亲君圆梦,创业一起来
  2. 详解python中的用法_详解python中*号的用法
  3. 4倍速!ML.NET Model Builder GPU 与 CPU 对比测试
  4. 祝贺王远当选为中国区第二位 Teams MVP
  5. Java 如何判定当前时间是否在某个范围
  6. 百度开发者大会:愿与开发者合作共赢
  7. 阿里云查找或修改对应实例的远程连接密码
  8. 对转义字符“\”的理解
  9. 经常用电脑辐射大怎么办?这5个习惯可以防辐射
  10. 【Python安装配置教程】
  11. 半退休95后,等拆迁款到位,就去开小卖部
  12. MTK平台Camera Dump Buffer处理
  13. CH9121串口转以太网模块STM32驱动
  14. 【转】可解释推荐系统:知其然,知其所以然
  15. [分享]PHP多城市版-房产系统源码,仿贝壳房产。
  16. JS整时整分整点事件
  17. 从16K跳槽到20K,最后算下来年薪却还降了,我笑了····
  18. 配置SD卡ext文件系统启动
  19. oracle 脚本go,Golang连接Oracle-Go语言中文社区
  20. 第十三届蓝桥杯竞赛板CT107D模块驱动

热门文章

  1. VS2008让Release配置也能调试起来~
  2. OGRE 2.1 Windows 编译
  3. DataCleaner 3.1.1 发布,数据质量分析管理
  4. C++数组名做函数形参/指针
  5. python读取csv文件第一行_尝试读取CSV文件的第一行返回['/']
  6. 数组对称_对称性应用在物理中的几个小例子
  7. scrolling=no 无法根据坐标获取元素_汽车制造行业如何选择三坐标测量仪?
  8. 饥荒计算机丢失xinput1 3.dll,《德军总部:旧血脉》Win8运行提示丢失XINPUT1_3.dll解决方法...
  9. 中国矿业大学计算机考研复试科目,中国矿业大学复试科目
  10. vscode插件可以直接复制到_一款可以让代码“跳舞”的 VS Code 插件:Power Mode