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