gcc中-pthread和-lpthread的区别
最近在使用linux mint15,里面自带的gcc时4.7的,当我编译多线程程序时,使用-lpthread居然说没有找到线程库函数!!!然后man了一下,才发现在gcc 4.7中链接线程库使用-pthread,而不是用-lpthread,为了搞清楚他们之间的区别,我进行了以下测试(测试方法我查找了好多网上的资料):
用gcc编译使用了POSIX thread的程序时通常需要加额外的选项,以便使用thread-safe的库及头文件,一些老的书里说直接增加链接选项 -lpthread 就可以了,像这样:
- gcc -c x.c
- gcc x.o -ox -lpthread
而gcc手册里则指出应该在编译和链接时都增加 -pthread 选项,像这样:
- gcc -pthread -c x.c
- gcc x.o -ox -pthread
那么 -pthread 相比于 -lpthread 链接选项究竟多做了什么工作呢?我们可以在verbose模式下执行一下对应的gcc命令行看出来。下面是老式的直接加 -lpthread 链接选项的输出结果:
- $ gcc -v -c x.c
- ...
- /usr/lib/gcc/i486-linux-gnu/4.2.4/cc1 -quiet -v x.c -quiet -dumpbase x.c
- -mtune=generic -auxbase x -version -fstack-protector -fstack-protector -o /tmp/cch4ASTF.s
- ...
- as --traditional-format -V -Qy -o x.o /tmp/cch4ASTF.s
- ...
- $ gcc -v x.o -ox -lpthread
- ...
- /usr/lib/gcc/i486-linux-gnu/4.2.4/collect2 --eh-frame-hdr -m elf_i386 --hash-style=both
- -dynamic-linker /lib/ld-linux.so.2 -ox
- /usr/lib/gcc/i486-linux-gnu/4.2.4/../../../../lib/crt1.o
- /usr/lib/gcc/i486-linux-gnu/4.2.4/../../../../lib/crti.o
- /usr/lib/gcc/i486-linux-gnu/4.2.4/crtbegin.o
- -L/opt/intel/Compiler/11.1/046/tbb/ia32/cc4.1.0_libc2.4_kernel2.6.16.21/lib/../lib
- -L/usr/lib/gcc/i486-linux-gnu/4.2.4
- -L/usr/lib/gcc/i486-linux-gnu/4.2.4
- -L/usr/lib/gcc/i486-linux-gnu/4.2.4/../../../../lib
- -L/lib/../lib
- -L/usr/lib/../lib
- -L/opt/intel/Compiler/11.1/046/lib/ia32
- -L/opt/intel/Compiler/11.1/046/tbb/ia32/cc4.1.0_libc2.4_kernel2.6.16.21/lib
- -L/usr/lib/gcc/i486-linux-gnu/4.2.4/../../..
- x.o -lpthread -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc
- --as-needed -lgcc_s --no-as-needed
- /usr/lib/gcc/i486-linux-gnu/4.2.4/crtend.o /usr/lib/gcc/i486-linux-gnu/4.2.4/../../../../lib/crtn.o
下面是在编译和链接时分别指定 -pthread 选项的输出结果:
- $ gcc -v -pthread -c x.c
- ...
- /usr/lib/gcc/i486-linux-gnu/4.2.4/cc1 -quiet -v <strong>-D_REENTRANT</strong>
- x.c -quiet -dumpbase x.c
- -mtune=generic -auxbase x -version -fstack-protector -fstack-protector -o /tmp/cc205IQf.s
- ...
- as --traditional-format -V -Qy -o x.o /tmp/cc205IQf.s
- ...
- $ gcc -v x.o -ox -pthread
- /usr/lib/gcc/i486-linux-gnu/4.2.4/collect2 --eh-frame-hdr -m elf_i386 --hash-style=both
- -dynamic-linker /lib/ld-linux.so.2 -ox
- /usr/lib/gcc/i486-linux-gnu/4.2.4/../../../../lib/crt1.o
- /usr/lib/gcc/i486-linux-gnu/4.2.4/../../../../lib/crti.o
- /usr/lib/gcc/i486-linux-gnu/4.2.4/crtbegin.o
- -L/opt/intel/Compiler/11.1/046/tbb/ia32/cc4.1.0_libc2.4_kernel2.6.16.21/lib/../lib
- -L/usr/lib/gcc/i486-linux-gnu/4.2.4
- -L/usr/lib/gcc/i486-linux-gnu/4.2.4
- -L/usr/lib/gcc/i486-linux-gnu/4.2.4/../../../../lib
- -L/lib/../lib
- -L/usr/lib/../lib
- -L/opt/intel/Compiler/11.1/046/lib/ia32
- -L/opt/intel/Compiler/11.1/046/tbb/ia32/cc4.1.0_libc2.4_kernel2.6.16.21/lib
- -L/usr/lib/gcc/i486-linux-gnu/4.2.4/../../..
- x.o -lgcc --as-needed -lgcc_s --no-as-needed <strong>-lpthread</strong>
- -lc -lgcc
- --as-needed -lgcc_s --no-as-needed
- /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的区别的更多相关文章
- 【转】gcc中-pthread和-lpthread的区别
原文网址:http://chaoslawful.iteye.com/blog/568602 用gcc编译使用了POSIX thread的程序时通常需要加额外的选项,以便使用thread-safe的库及 ...
- 编译参数中-pthread以及-lpthread的区别
一般情况下,我们在链接一个(文件名为libxxx.so或libxxx.a等的)库时,会使用-lxxx的方式:在Linux中要用到多线程时,需要链接pthread库,按照惯例,我们应该使用-lpthre ...
- GCC 中 -L、-rpath和-rpath-link的区别
GCC 中 -L.-rpath和-rpath-link的区别 来源 http://blog.csdn.net/q1302182594/article/details/42102961 关于这3个参数的 ...
- GNU C/C++ __attributes__ GCC中的弱符号与强符号
最近在看一些源代码,遇到了一些使用__attribute__修饰函数和变量的属性方面的代码,不是太了解,很是汗颜,再此做个总结: GCC使用__attribute__关键字来描述函数,变量和数据类 ...
- GCC中的弱符号与强符号
GCC中的弱符号与强符号 我们经常在编程中碰到一种情况叫符号重复定义.多个目标文件中含有相同名字全局符号的定义,那么这些目标文件链接的时候将会出现符号重复定义的错误.比如我们在目标文件A和目标文件B都 ...
- [转] GCC 中的编译器堆栈保护技术
以堆栈溢出为代表的缓冲区溢出已成为最为普遍的安全漏洞.由此引发的安全问题比比皆是.早在 1988 年,美国康奈尔大学的计算机科学系研究生莫里斯 (Morris) 利用 UNIX fingered 程序 ...
- GCC 中的编译器堆栈保护技术
GCC 中的编译器堆栈保护技术 前几天看到的觉得不错得博客于是转发了,但这里我补充一下一些点. GCC通过栈保护选项-fstack-protector-all编译时额外添加两个符号,__stack_c ...
- gcc,g++,make,cmake的区别
首先介绍一下GCC:GNU Compiler Collection(GNU 编译器集合),在为Linux开发应用程序时,绝大多数情况下使用的都是C语言,因此几乎每一位Linux程序员面临的首要问题都是 ...
- 【转】为什么我们都理解错了HTTP中GET与POST的区别
GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二. 最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数. 你可能自己 ...
随机推荐
- WPF GroupBox 样式分享
原文:WPF GroupBox 样式分享 默认样式 GroupBox 样式分享" title="WPF GroupBox 样式分享"> 添加样式后 GroupBox ...
- linux系统怎么改为中文版(转)
linux系统安装好后怎么改为中文版呢?今天就跟大家介绍下linux系统改为中文版的方法,希望能帮助到大家! 以下是linux系统改为中文版的四种方法,一起来看看: 方法1:写入环境变量 echo & ...
- perl /m 当作多行处理
高级用法 多行匹配: zjtest7-frontend:/root/0825# cat a2.pl print "1111111111111\n"; my $_="abc ...
- Logstash type来标记事件类型,通过type判断
/*************** 根据type判断 input { file { type => "zj_frontend_access" path => [" ...
- JIRA官方:JIRA项目跟踪
问题无处不在 使用JIRA来捕捉任何类型的问题——从软件缺陷到新特性到需求和故事到任务和活动项.你可以很方便地定义自己的问题类型以匹配团队工作需要. 自定义工作流 一个项目跟踪工具不应该决定你的工作方 ...
- 【LeetCode练习题】Unique Paths
Unique Paths A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagra ...
- API经济产业
技术大咖为我们铺好了前进道路,我们为什么还要敬而远之舍近索远呢?充分利用开源,利用API进行App有效整合. 为应用添加日志功能,Loggly; 为应用添加用户管理和身份认证模块,Stormpath; ...
- curl几个选项
1.--cacert 选项请看https://curl.haxx.se/docs/sslcerts.html 2.CURL库怎样验证服务器证书 [复制链接] 中提到:你是客户端, 你希望的是: 你拿 ...
- 浏览器桌面通知(notifications)
近期在做公司后台管理系统,当有任务到来时,须要通知当事人,可是 当事人有可能在做别的,浏览器有可能会被最小化,这样就非常难看到通知了.经过查找发现有些浏览器能够使用noitfications.能够在桌 ...
- ZCTF-final-restaurant1
和线上赛的题目差别不大,但是需要自己去泄露堆的地址.除了线上赛的溢出之外,还多了一个Use After Free的洞.我写了两种利用方法. 线上赛writeup见:http://www.cnblogs ...