我有一个自定义工具,我希望在预处理和编译之间作为编译过程的一部分运行。对于海湾合作委员会,我这样做:
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”都不是有效答案,对不起。
相关(但未解决速度问题)
答案 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自定义版本”。