码迷,mamicode.com
首页 > 其他好文 > 详细

编译参数中-pthread以及-lpthread的区别

时间:2018-01-17 00:41:36      阅读:138      评论:0      收藏:0      [点我收藏+]

标签:groups   添加   文件中   ups   没有   全局变量   gpo   全局   google   

在看到MXNet中的Makefile发现LDFLAG里面的是-pthread。

转自:https://www.cnblogs.com/rex-tech/p/3583756.html

编译参数中-pthread以及-lpthread的区别
一般情况下,我们在链接一个(文件名为libxxx.so或libxxx.a等的)库时,会使用-lxxx的方式;在Linux中要用到多线程时,需要链接pthread库,按照惯例,我们应该使用-lpthread的方式来进行链接;但是,通过日常的观察,我发现很多开源代码都是使用了-pthread参数,而非使用-lpthread,这是为什么呢?

一通Google后,总算找到一些线索:

1. 为了可移植性:在Linux中,pthread是作为一个单独的库存在的(libpthread.so),但是在其他Unix变种中却不一定,比如在FreeBSD中是没有单独的pthread库的,因此在FreeBSD中不能使用-lpthread来链接pthread,而使用-pthread则不会存在这个问题,因为FreeBSD的编译器能正确将-pthread展开为该系统下的依赖参数。同样道理,其他不同的变种也会有这样那样的区别,如果使用-lpthread,则可能在移植到其他Unix变种中时会出现问题,为了保持较高的可移植性,我们最好还是使用-pthread(尽管这种做法未被接纳成为C标准,但已基本是事实标准)。


2. 添加额外的标志:在多数系统中,-pthread会被展开为“-D_REENTRANT -lpthread”,即是除了链接pthread库外,还先定义了宏_REENTRANT。定义这个宏的目的,是为了打开系统头文件中的各种多线程支持分支。比如,我们常常使用的错误码标志errno,如果没有定义_REENTRANT,则实现为一个全局变量;若是定义了_REENTRANT,则会实现为每线程独有,从而避免线程竞争错误。

 

参考资料:

https://groups.google.com/forum/#!topic/comp.programming.threads/NCEpG0EOCCY

http://www.lambdacs.com/cpt/FAQ.html#Q300

 

编译参数中-pthread以及-lpthread的区别

标签:groups   添加   文件中   ups   没有   全局变量   gpo   全局   google   

原文地址:https://www.cnblogs.com/Key-Ky/p/8298013.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!