40

在 Linux(内核 2.6.5)上,我们的构建系统使用-D_REENTRANT.

使用时还需要这个pthreads吗?

它与gcc -pthread期权有什么关系?我知道我应该-pthread与 pthreads 一起使用,我还需要-D_REENTRANT吗?

附带说明一下,您知道在 gcc 3.3.3 和 gcc 4.xx 之间使用 REENTRANT 之间有什么区别吗?

当我使用-pthreadgcc 选项时,我可以看到它_REENTRANT被定义了。-D_REENTRANT从命令行省略是否会产生任何影响,例如,是否可以在没有多线程支持的情况下编译某些对象,然后链接到使用 pthread 的二进制文件中并会导致问题?

我认为应该可以使用: g++ -pthread

> echo | g++          -E -dM -c - > singlethreaded
> echo | g++ -pthread -E -dM -c - > multithreaded
> diff singlethreaded multithreaded
39a40
> #define _REENTRANT 1

我们正在编译多个静态库和与静态库链接的应用程序,库和应用程序都使用 pthread。

我相信它在过去的某个阶段是必需的,但想知道它是否仍然是必需的。谷歌搜索没有返回任何最近提到的信息 - D_REENTRANTwith pthreads. 您能否指出我在最近版本的kernel/gcc/pthread中讨论使用的链接或参考资料?

澄清:目前我们正在使用 -D_REENTRANT 和 -lpthread,我假设我可以用 g++ -pthread 替换它们,查看 man gcc 它为预处理器和链接器设置了标志。有什么想法吗?

4

3 回答 3

18

对我来说,最好的答案是pts如果他愿意提交它作为答案的评论:

您进行了适当的调查并回答了您自己的问题。使用g++ -pthread,就相当于g++ -lpthread -D_REENTRANT。使用g++ -D_REENTRANT会有所不同,它可能不会设置所有链接器标志。– 点 5 月 18 日 0:30

于 2009-05-21T01:28:25.083 回答
7

从 gcc 信息页面:

`-pthread'
     Adds support for multithreading with the "pthreads" library.  This
     option sets flags for both the preprocessor and linker.

所以只需 -pthread 标志就足够了。但是,我不建议仅将其传递给您的某些代码。

正如 Chris 在评论中建议的那样,在 Linux 上使用 gcc -dumpspecs 确实确认它也设置了预处理器标志:

%{posix:-D_POSIX_SOURCE} %{pthread:-D_REENTRANT}
于 2009-05-18T02:18:32.930 回答
5

gcc 的 -pthreads 标志设置了在您所在平台上支持 pthreads 所需的相关编译器和链接器标志。

你是对的,在 linux x86(可能还有许多其他平台)上,这相当于'-D_REENTRANT -lpthread',但在所有平台上都不一定如此。

(至少有一段时间,在 aix 上,-pthread 导致 g++ 链接到一个完全不同的 libstdc++.a。不过,我不知道现在是否仍然如此……)

于 2009-05-18T02:42:45.553 回答