Vis*_*j V 99 multithreading gcc pthreads thread-safety compiler-flags
是什么区别gcc -pthread和gcc -lpthread它在编译多线程程序中使用?
Mic*_*urr 108
-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
Run Code Online (Sandbox Code Playgroud)
使用该-lpthread选项只会导致pthread库链接 - 预定义的宏不会被定义.
底线:您应该使用该-pthread选项.
注意:该-pthread选项在GCC文档中记录为特定于平台的选项,因此可能并不总是可用.但是,它可以在GCC文档未明确列出的平台上使用(例如i386和x86-64) - 您应该在可用时使用它.
另请注意,GCC已使用其他类似选项,例如-pthreads(-pthread在Solaris 2上列为同义词)和-mthread(对于i386和x86-64 Windows上的MinGW特定线程支持).我的理解是海湾合作委员会正在努力-pthread向前迈进.
Max*_*kin 18
有一个公认的答案,但是,IMO,它没有提供足够的背景和洞察力。因此,这个额外的答案。
-lpthread 是一个不再存在的问题的解决方案(自 2005 年以来)。
在过去,有不符合 POSIX 标准的Pthreads API 的专有实现,例如LinuxThreads。POSIX 标准只是说,如果想要符合 POSIX 的行为,那么必须链接-lpthread,如果有许多实现,则必须链接,并且链接是链接 Pthreads API 的 POSIX 兼容实现所必需的。
现代操作系统中没有 Pthreads API 的多种实现。这就是为什么-lpthread不再有任何目的的原因。
像gccand 之类的编译器clang(可能还有所有与 Linux 兼容的编译器)需要使用-pthread命令行选项来编译和链接符合 POSIX 的多线程应用程序,这是必须使用的。
在编译时,-pthread选项表明请求 Pthread API(可以有多个线程 API,例如 Solaris Threads)并定义特定_REENTRANT于平台的宏(在 Linux 上,_MT在 Solaris 上)。
在链接时,-pthread实现符合 POSIX 的 Pthreads API 行为的所需库(如果有)中的链接。
上面清楚地说明了为什么-lpthread既不必要也不充分。
GNU libc 2.34:
新应用程序不再需要与
-lpthread、-ldl、-lutil、链接-lanl。为了向后兼容,空静态档案libpthread.a,libdl.a,libutil.a,libanl.a提供,因此链接选项继续工作。已经链接到 glibc 2.33 或更早版本的应用程序继续加载相应的共享对象(现在是空的)。
| 归档时间: |
|
| 查看次数: |
51628 次 |
| 最近记录: |