我需要-D_REENTRANT和-pthreads吗?

ste*_*anB 39 linux gcc pthreads

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

使用时仍然需要这个pthreads吗?

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

另外,你知道在gcc 3.3.3和gcc 4.xx之间使用REENTRANT之间有什么区别吗?

当我使用-pthreadgcc选项时,我可以看到它_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_REENTRANTpthreads.你能指点我讨论在最近版本的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

  • 那应该是“......它相当于 g++ -lpthread -D_REENTRANT”?即第二个 -pthread 应该是 -lpthread (2认同)

bdo*_*lan 7

从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)


Sto*_*bor 5

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

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

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