标准输入作为 MSVC 的输入文件

stdin as input file for MSVC

我有一个自定义工具,我想 运行 作为编译过程的一部分,在预处理和编译之间。对于 GCC,我这样做:

gcc [options] -E source.c | mytool | gcc [options] -c source.o -xc -

但是,我还没有想出如何为 MSVC 做类似的事情。目前我有

cl.exe [options] /EP source.c | mytool.exe > temp.c
cl.exe [options] /c temp.c

这里的问题是对于每个源文件(数千个),我都有一个额外的磁盘 write/read 周期。此外,当 MSVC 输出 .i 文件时,它们往往会变得非常大。超过 10MB 大。所以每个文件的 10MB 磁盘 I/O 堆积得非常快。

所以,我的问题:

1) 是否可以让 cl.exe 将标准输入作为输入文件读取?

2) 如果没有,是否可以创建一个可以读取的内存映射文件?

3) 有更好的方法吗?

不,"get an SSD" 和 "don't use MSVC" 不是有效答案,抱歉。

相关(但不解决速度问题)

在 Visual Studio 2010 中,在“属性”页面下的“配置属性”部分 "Custom Build Step"。试试这个部分。

同时在互联网上搜索 "MSDN Visual Studio custom build"。

供将来参考:我发现没有办法欺骗 cl.exe 从内存而不是磁盘读取。

但是,我设法通过在第一阶段使用 GNU CPP 将过程加快到可接受的速度,然后 cl.exe 仅用于编译。所以:

cpp.exe [options] source.c | mytool.exe > temp.c
cl.exe [options] temp.c

cpp.exe 生成的文件比 cl.exe /E 小 5-10 倍。诀窍就是让它定义 _MSC_VER 和类似的而不是 __GNUC__。我通过使用 -undef 选项摆脱一切,然后手动定义 MSFT 特定的选项来做到这一点。我可能会考虑使用 clang 作为 CPP,因为它可以模仿 MSVC。

CPP 完整保留了 #pragma 指令,因此没有兼容性问题。


我现在已经达到了一个性能点,进程的产生对整体构建时间有重大影响,所以我正在研究将预处理器编译成 mytool.exe