我需要使用-D_REENTRANT和-pthreads吗?

40
在Linux(内核2.6.5)中,我们的构建系统使用-D_REENTRANT调用gcc。

在使用pthreads时,这仍然需要吗?

它与gcc -pthread选项有什么关系?我知道在pthreads中应该使用-pthread,但我还需要-D_REENTRANT吗?

另外,您是否了解在使用gcc 3.3.3和gcc 4.x.x之间使用REENTRANT的任何区别?

当我使用-pthread gcc选项时,我可以看到_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_REENTRANTpthreads。您能指向一些链接或参考资料讨论最新版本的 kernel/gcc/pthread 的使用吗?

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


18
你进行了适当的调查并回答了自己的问题。使用 g++ -pthread,它等同于 g++ -pthread -D_REENTRANT。使用 g++ -D_REENTRANT 会有所不同,可能无法设置所有的链接器标志。 - pts
1
嗯,所以要么是 g++ -D_REENTRANT -lpthread 要么是 g++ -pthread,两种形式都有相同的效果? - stefanB
6
使用 -pthread,而不是 -lpthread。-pthread选项设置了所有必要的线程标志,无论你在哪个平台上。使用 -lpthread 只会链接 libpthread,这对于某些平台可能不足够。(例如,以前的 OpenBSD 没有 libpthread,而是使用 libc_r。) - C. K. Young
4
查看平台上-pthread的快速方法是运行“gcc -dumpspecs”。 - C. K. Young
3个回答

18

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

  

你做了适当的调查,并回答了   你自己的问题。使用g++ -pthread,   它相当于g++ -lpthread -D_REENTRANT。 使用g++ -D_REENTRANT则不同,   它可能无法设置所有的链接器标志。- pts May 18 at 0:30


2
这应该是“...它等同于g++ -lpthread -D_REENTRANT”吗?也就是说,第二个-pthread应该是-lpthread。 - BCran

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}

5

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

你说得对,在Linux x86(以及可能许多其他平台)上,这相当于“-D_REENTRANT -lpthread”,但这并不一定适用于所有平台。

(至少在某些时间内,在aix上,-pthread导致g ++链接一个完全不同的libstdc ++.a。我不知道现在是否仍然是这种情况...)


至少在某些时间内,在aix上,-pthread导致g++链接到完全不同的libstdc++.a。+1,这清除了AIX上的崩溃,因为我们没有使用-pthread或-D_REENTRANT,但我们使用了-lpthread。 - jww

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接