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);

将视频文件作为字节流式传输到stdin

Linux shell编程

Qt 5.5.1 MSVC 2013,32 位 - LNK1181:无法打开输入文件 'NIDAQmx.lib'

linux呈现数据

STDIN_FILENO与stdin区别(转)