我有一个自定义工具,我希望在预处理和编译之间作为编译过程的一部分运行.对于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"是无效的答案,对不起.
相关(但没有解决速度问题)
供将来参考:我发现没有办法欺骗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.