编译多线程程序时使用的gcc -pthread
和gcc -lpthread
之间有什么区别?
答案 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
不再具有任何作用的原因。
gcc
和clang
之类的编译器(可能还有所有与Linux兼容的编译器)需要使用-pthread
命令行选项来编译和链接POSIX兼容的多线程应用程序,这是必须使用的。
在编译时,-pthread
选项表明请求了Pthread API(可以有多个线程API,例如Solaris Threads),并在平台上定义了平台特定的宏(_REENTRANT
on Linux,_MT
Solaris)。
在链接时,-pthread
在必需的库(如果有)中链接,这些库实现了POSIX兼容的Pthreads API行为。
以上内容很清楚地说明了为什么-lpthread
既不必要也不充分。