ste*_*anB 39 linux gcc pthreads
在Linux(内核2.6.5)上,我们的构建系统调用gcc -D_REENTRANT
.
使用时仍然需要这个pthreads
吗?
它与gcc -pthread
选项有什么关系?我知道我应该使用-pthread
pthreads,我还需要-D_REENTRANT
吗?
另外,你知道在gcc 3.3.3和gcc 4.xx之间使用REENTRANT之间有什么区别吗?
当我使用-pthread
gcc选项时,我可以看到它_REENTRANT
被定义了.-D_REENTRANT
从命令行省略会有什么不同,例如,某些对象可以在没有多线程支持的情况下编译,然后链接到使用pthreads的二进制文件并导致问题吗?
我认为应该可以使用: g++ -pthread
> echo | g++ -E -dM -c - > singlethreaded
> echo | g++ -pthread -E -dM -c - > multithreaded
> diff singlethreaded multithreaded
39a40
> #define _REENTRANT 1
Run Code Online (Sandbox Code Playgroud)
我们正在编译多个静态库和与静态库链接的应用程序,库和应用程序都使用pthread.
我相信它在过去的某个阶段是必需的,但想知道它是否仍然需要.谷歌搜索没有返回任何最近提到的信息 - D_REENTRANT
用pthreads
.你能指点我讨论在最近版本的kernel/gcc/pthread中使用的链接或引用吗?
澄清:目前我们正在使用-D_REENTRANT和-lpthread,我假设我可以用g ++ -pthread替换它们,看看man gcc它为预处理器和链接器设置了标志.有什么想法吗?
ste*_*anB 17
对我来说,最好的答案是评论,pts
如果只是他打扰提交它作为答案:
你调查得当,回答了你自己的问题.使用
g++ -pthread
,相当于g++ -lpthread -D_REENTRANT
.使用g++ -D_REENTRANT
会有所不同,它可能不会设置所有链接器标志. - 5月18日0:30
从gcc信息页面:
`-pthread'
Adds support for multithreading with the "pthreads" library. This
option sets flags for both the preprocessor and linker.
Run Code Online (Sandbox Code Playgroud)
所以只需-pthread标志即可.但是,我不建议仅将其传递给您的某些代码.
正如Chris在评论中所建议的,在Linux上使用gcc -dumpspecs确实确认它也设置了预处理器标志:
%{posix:-D_POSIX_SOURCE} %{pthread:-D_REENTRANT}
Run Code Online (Sandbox Code Playgroud)
gcc的-pthreads标志设置了您所在平台上pthreads支持所需的相关编译器和链接器标志.
你是对的,在linux x86(可能还有许多其他平台)上,这相当于'-D_REENTRANT -lpthread',但在所有平台上都不一定如此.
(至少在一段时间内,在aix上,-pthread导致g ++链接到一个完全不同的libstdc ++.a.我不知道现在是否仍然如此,但......)