stdin作为MSVC的输入文件

stdin as input file for MSVC

本文关键字:输入 文件 MSVC 作为 stdin      更新时间:2023-10-16

我有一个自定义工具,我想把它作为编译过程的一部分,在预处理和编译之间运行。对于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

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

我的问题是:

1)是否有可能让cl.exe读取处理stdin作为输入文件?

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

3)有没有更好的方法来做这件事?

不,"买一个SSD"answers"不要使用MSVC"不是有效的答案,抱歉。

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

  • 在编译前通过外部工具解析预处理源的任何方法?
  • 如何在两个单独的步骤中运行MSVC预处理器和编译器?

供将来参考:我发现没有办法欺骗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中。

在Visual Studio 2010中,在属性页的配置属性下,有一个"自定义构建步骤"的部分。试试这个部分。

也可以在网上搜索"MSDN Visual Studio custom build"