Linux编译命令-pthread & -lpthread

Posted 邗影

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux编译命令-pthread & -lpthread相关的知识,希望对你有一定的参考价值。

编译makefile的时候到make编译连接阶段总是提示,无法打开某某库或者某某库的格式不对(1 先看看32位,64位是否对应:BITS,cflags lflags....,2 是否将.OS .a等依赖库的目录导入变量LIBS)

 

然后看看是不是没有对应位数的编译工具, 需要安装 gcc-multilib 这个软件包,在Ubuntu 上安装这个软件包:
sudo apt-get install gcc-multilib
g++ 也同样如此
sudo apt-get install g++-multilib

 

 

看看连接动态库的时候 是否有 -L./ ***.SO

 

再然后看看多线程编译的这个命令 -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,则会实现为每线程独有,从而避免线程竞争错误。

参考资料:

  1. https://groups.google.com/forum/#!topic/comp.programming.threads/NCEpG0EOCCY
  2. http://www.lambdacs.com/cpt/FAQ.html#Q300
  3. 转:
     

以上是关于Linux编译命令-pthread & -lpthread的主要内容,如果未能解决你的问题,请参考以下文章

Linux中XAMPP中的Pthreads

linux应用中,在一个进程内如何获取本进程内其它线程的堆栈信息、

主机和目标的 Makefile

Linux互斥量&条件变量

在Clion的IDE中指定命令行参数

编译时 -pthread 标志的意义