stdin作为MSVC的输入文件

时间:2015-07-24 16:45:39

标签: c++ c visual-c++

我有一个自定义工具,我希望在预处理和编译之间作为编译过程的一部分运行。对于海湾合作委员会,我这样做:

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”都不是有效答案,对不起。

相关(但未解决速度问题)

2 个答案:

答案 0 :(得分:2)

供将来参考:我发现无法欺骗var ajaxurl = "<?= admin_url('admin-ajax.php'); ?>"; jQuery.post(ajaxurl, data, function(response){ [...] }从内存中读取而不是磁盘。

但是,我设法通过在第一阶段使用GNU CPP将进程加速到可接受的速度,然后cl.exe仅用于编译。所以:

cl.exe

cpp.exe [options] source.c | mytool.exe > temp.c cl.exe [options] temp.c 生成的文件比cpp.exe小5-10倍。诀窍就是让它定义cl.exe /E和类似而不是_MSC_VER。我这样做是通过使用__GNUC__选项去除所有内容,然后手动定义MSFT特定的。我可能会考虑使用clang作为CPP,因为它可以模仿MSVC。

CPP使-undef指令保持不变,因此兼容性没有问题。

我现在达到了一个性能点,其中一个进程的产生对总体构建时间有显着影响,因此我正在考虑将预处理器编译为#pragma

答案 1 :(得分:1)

在Visual Studio 2010中,在Propererty页面下的Configuration Properties,“Custom Build Step”部分。试试这一节。

还在互联网上搜索“MSDN Visual Studio自定义版本”。