stdin 作为 MSVC 的输入文件
Posted
技术标签:
【中文标题】stdin 作为 MSVC 的输入文件【英文标题】:stdin as input file for MSVC 【发布时间】:2015-07-24 16:45:38 【问题描述】:我有一个自定义工具,我想将它作为编译过程的一部分在预处理和编译之间运行。对于 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”不是有效的答案,抱歉。
相关(但不解决速度问题)
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?【问题讨论】:
为临时文件创建一个 ramdisk? @EugeneSh。好主意,但我无法访问所有运行构建的系统,除了通过makefile。但是,我可能会为我自己的系统这样做。 如果是C,为什么要加C++标签? @Olaf 两者都适用,我只是在示例中使用了 C。 你为什么在乎。一个合适的操作系统应该为你做缓冲。只要有足够的可用 RAM。 (而且它还允许重定向标准输入/输出) - 不知道 Windows 是否支持。 【参考方案1】:供将来参考:我发现无法欺骗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
。
【讨论】:
【参考方案2】:在 Visual Studio 2010 中,在“属性”页面下的“配置属性”,“自定义构建步骤”部分。试试这个部分。
还可以在 Internet 上搜索“MSDN Visual Studio 自定义构建”。
【讨论】:
谢谢,我去看看。不使用 Visual Studio,只使用编译器二进制文件,但它可能会提供一些想法。以上是关于stdin 作为 MSVC 的输入文件的主要内容,如果未能解决你的问题,请参考以下文章
C语言//freopen("data.in", "r", stdin);