编译时-pthread和-lpthread之间的差异

时间:2014-04-23 17:04:15

标签: multithreading gcc thread-safety pthreads compiler-flags

编译多线程程序时使用的gcc -pthreadgcc -lpthread之间有什么区别?

3 个答案:

答案 0 :(得分:99)

-pthread告诉编译器链接pthread库以及配置线程的编译。

例如,下面显示了在我的Ubuntu机器上安装的GCC包上使用-pthread选项时定义的宏:

$ gcc -pthread -E -dM test.c > dm.pthread.txt
$ gcc          -E -dM test.c > dm.nopthread.txt
$ diff dm.pthread.txt dm.nopthread.txt 
152d151
< #define _REENTRANT 1
208d206
< #define __USE_REENTRANT 1

使用-lpthread选项只会导致pthread库被链接 - 预定义的宏不会被定义。

底线:您应该使用-pthread选项。


注意:-pthread选项在GCC文档中记录为特定于平台的选项,因此可能并不总是可用。但是,它可以在GCC文档未明确列出的平台上使用(例如i386和x86-64) - 您应该在可用时使用它。

另请注意,GCC已使用其他类似选项,例如-pthreads(在Solaris 2上列为-pthread的同义词)和-mthread(用于MinGW特定的线程支持)在i386和x86-64 Windows上)。我的理解是,海湾合作委员会正试图继续使用-pthread向前推进。

答案 1 :(得分:7)

-pthread使用pthreads库添加对多线程的支持。此选项为预处理器和链接器(man gcc)设置标志。

,而

-lpthread存在,而链接则在预处理时不会产生任何影响。

答案 2 :(得分:6)

有一个可接受的答案,但是,IMO,它没有提供足够的上下文和见识。因此,这个额外的答案。


-lpthread是针对不再存在的问题(自2005年以来)的解决方案。

过去,Pthreads API的专有实现不符合POSIX,例如LinuxThreads。 POSIX标准只是说,如果一个人想要POSIX兼容的行为,则必须与-lpthread链接,并且链接一个POSIX兼容的Pthreads API实现所需的链接,应该有很多实现

在现代操作系统中没有Pthreads API的多种实现。这就是-lpthread不再具有任何作用的原因。


gccclang之类的编译器(可能还有所有与Linux兼容的编译器)需要使用-pthread命令行选项来编译和链接POSIX兼容的多线程应用程序,这是必须使用的。

在编译时,-pthread选项表明请求了Pthread API(可以有多个线程API,例如Solaris Threads),并在平台上定义了平台特定的宏(_REENTRANT on Linux_MT Solaris)。

在链接时,-pthread在必需的库(如果有)中链接,这些库实现了POSIX兼容的Pthreads API行为。

以上内容很清楚地说明了为什么-lpthread既不必要也不充分。