繁体   English   中英

stdin作为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

这里的问题是,对于每个源文件(数千),我有一个额外的磁盘写/读周期。 此外,当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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM