标准输入作为 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" 不是有效答案,抱歉。
相关(但不解决速度问题)
- Any way to parse preprocessed source through external tool before it compiles?
- How can I run the MSVC preprocessor and compiler in two separate steps?
在 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
。
我有一个自定义工具,我想 运行 作为编译过程的一部分,在预处理和编译之间。对于 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" 不是有效答案,抱歉。
相关(但不解决速度问题)
- Any way to parse preprocessed source through external tool before it compiles?
- How can I run the MSVC preprocessor and compiler in two separate steps?
在 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
。