[英]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
这里的问题是,对于每个源文件(数千),我有一个额外的磁盘写/读周期。 此外,当MSVC输出.i文件时,它们往往变得非常大。 超过10MB大。 因此,每个文件的10MB磁盘I / O堆积起来非常快。
所以,我的问题:
1)是否可以让cl.exe读取将stdin视为输入文件?
2)如果没有,是否可以创建一个可以读取的内存映射文件?
3)有更好的方法吗?
不,“获得SSD”和“不使用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中,在Propererty页面下的Configuration Properties,“Custom Build Step”部分。 试试这一节。
还可以在Internet上搜索“MSDN Visual Studio自定义构建”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.