编译时-pthread和-lpthread之间的区别


Answers:


116

-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统一使用。


2
这很奇怪,因为它直接与POSIX相矛盾。POSIX要求传递-lpthread足以获取整个POSIX线程库。
fuz

@FUZxxl Passing -lpthread 确实获得了整个POSIX线程库。
user253751 '16

5
@immibis不,我的意思是,POSIX表示与之链接-lpthread应该足以获得完整的pthreads支持。不需要其他编译标志。
fuz 2016年

1
@alecov gcc的问题在于,使用pcc进行编译(-lpthread-pthread不足以获取pthread支持),正如我在先前的评论中已经阐明的那样。
fuz

2
@alecov POSIX要求,如果配置POSIX环境并与链接,则pthread必须起作用-lpthread。但是,gcc文档建议这可能不足以获得pthreads的支持,这就是我在前面的评论中指出的重点。我完全不关心如果您不提供-lpthread或随机提供其他专有选项会发生什么情况。-lpthreadPOSIX 仅指定它来保证pthread,而对于gcc似乎还不够。
FUZ

10

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

-lpthread 连接时存在,而在预处理时则没有影响。


4

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


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

在过去,有一些不兼容POSIX 的Pthreads API专有实现,例如LinuxThreads。POSIX标准只是说,如果想要一个POSIX兼容的行为,则必须与进行链接-lpthread,并且如果有许多实现,则必须链接POSIX兼容的Pthreads API 实现

现代操作系统中没有Pthreads API的多种实现。这就是为什么-lpthread不再有用的原因。


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

在编译时,-pthreadoption表示请求了Pthread API(可以有多个线程API,例如Solaris Threads),并定义了平台特定的宏(_REENTRANT在Linux上_MT在Solaris上)。

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

上面已经清楚了为什么-lpthread既没有必要又不够充分的原因。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.