stdin作为MSVC的输入文件

mti*_*nic 6 c c++ visual-c++

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

gcc [options] -E source.c | mytool | gcc [options] -c source.o -xc -
Run Code Online (Sandbox Code Playgroud)

但是,我还没弄清楚如何为MSVC做类似的事情.目前我有

cl.exe [options] /EP source.c | mytool.exe > temp.c
cl.exe [options] /c temp.c
Run Code Online (Sandbox Code Playgroud)

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

所以,我的问题:

1)是否可以让cl.exe读取将stdin视为输入文件?

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

3)有更好的方法吗?

不,"获得SSD"和"不使用MSVC"是无效的答案,对不起.

相关(但没有解决速度问题)

mti*_*nic 4

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

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

cpp.exe [options] source.c | mytool.exe > temp.c
cl.exe [options] temp.c
Run Code Online (Sandbox Code Playgroud)

cpp.exe生成的文件比cl.exe /E. 诀窍只是让它定义_MSC_VER和相似而不是__GNUC__. 我通过使用-undef删除所有内容的选项,然后手动定义 MSFT 特定内容来完成此操作。我可能会考虑使用 clang 作为 CPP,因为它可以模仿 MSVC。

CPP#pragma完整保留了指令,因此不存在兼容性问题。


我现在已经达到了一个性能点,进程的生成对整体构建时间有显着影响,因此我正在考虑将预处理器编译为mytool.exe.