基于gcc: Do I need -D_REENTRANT with pthreads?
> echo | g++ -E -dM -c - > singlethreaded
> echo | g++ -pthread -E -dM -c - > multithreaded
> diff singlethreaded multithreaded
39a40
> #define _REENTRANT 1
作者使用上面的命令导出编译器使用的选项。 我想知道为什么这样的命令会详细说明:
> echo | g++ -E -dM -c - > singlethreaded
我理解以下部分:
> singlethread # means to redirect the results to the file singlethread
答案 0 :(得分:3)
-dM
选项:
而不是正常输出,生成 所有的#define指令列表 在期间定义的宏 执行预处理器, 包括预定义的宏。这个 为您提供一种找出问题的方法 在您的版本中预定义 预处理器。
-E
选项:
在预处理阶段后停止;做 不正确运行编译器。该 输出采用预处理的形式 源代码,发送给 标准输出。
-c
选项导致编译器编译但不链接。这对-E选项来说是多余的。
单独的-
告诉编译器从stdin读取它的输入。
因此,命令将空流回送到stdout
,将空流管道传递给g++
,然后读取空流但只运行预处理器,已经告知它忽略输入(空)并输出已定义的预处理器宏的完整列表。
答案 1 :(得分:1)
echo | g++ -
告诉g++
编译stdin
并传入一个空程序(来自echo
的空白行)。 -E
选项仅调用预处理器(它类似于直接运行cpp
,但具有由g++
自动定义的任何宏。 -dM
选项是一个调试标志,它在特定步骤中转储编译器内的状态:
-dM -fdump-rtl-mach Dump after performing the machine dependent reorganization pass, to file.155r.mach.
所有这一切的目的是通过比较转储输出来更改命令行参数-pthread
时发现编译器设置的不同宏。