Answers:
-pthread
告诉编译器链接到pthread库以及为线程配置编译。
例如,以下内容显示了-pthread
在我的Ubuntu计算机上安装的GCC软件包上使用该选项时定义的宏:
$ 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
(-pthread
在Solaris 2上列为同义词)和-mthread
(对于i386和x86-64 Windows上的MinGW特定线程支持)。我的理解是,海湾合作委员会正在努力过渡到-pthread
统一使用。
-lpthread
足以获取整个POSIX线程库。
-lpthread
确实获得了整个POSIX线程库。
-lpthread
应该足以获得完整的pthreads支持。不需要其他编译标志。
-lpthread
但-pthread
不足以获取pthread支持),正如我在先前的评论中已经阐明的那样。
-lpthread
。但是,gcc文档建议这可能不足以获得pthreads的支持,这就是我在前面的评论中指出的重点。我完全不关心如果您不提供-lpthread
或随机提供其他专有选项会发生什么情况。-lpthread
POSIX 仅指定它来保证pthread,而对于gcc似乎还不够。
-pthread
使用pthreads库增加了对多线程的支持。该选项为预处理器和链接器(man gcc
)设置标志。
而
-lpthread
连接时存在,而在预处理时则没有影响。
有一个公认的答案,但是,IMO,它没有提供足够的上下文和见识。因此,这个额外的答案。
-lpthread
是一个不再存在的问题的解决方案(自2005年以来)。
在过去,有一些不兼容POSIX 的Pthreads API专有实现,例如LinuxThreads。POSIX标准只是说,如果想要一个POSIX兼容的行为,则必须与进行链接-lpthread
,并且如果有许多实现,则必须链接POSIX兼容的Pthreads API 实现。
现代操作系统中没有Pthreads API的多种实现。这就是为什么-lpthread
不再有用的原因。
像gcc
and clang
(可能还有所有与Linux兼容的编译器)之类的编译器都要求使用-pthread
命令行选项来编译和链接POSIX兼容多线程应用程序,而这正是必须使用的。
在编译时,-pthread
option表示请求了Pthread API(可以有多个线程API,例如Solaris Threads),并定义了平台特定的宏(_REENTRANT
在Linux上,_MT
在Solaris上)。
在链接时,-pthread
实现POSIX兼容Pthreads API行为的必需库(如果有)中的链接。
上面已经清楚了为什么-lpthread
既没有必要又不够充分的原因。