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"answers"不要使用MSVC"不是有效的答案,抱歉。
相关(但不能解决速度问题)
- 在编译前通过外部工具解析预处理源的任何方法?
- 如何在两个单独的步骤中运行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中,在属性页的配置属性下,有一个"自定义构建步骤"的部分。试试这个部分。
也可以在网上搜索"MSDN Visual Studio custom build"
- 用c++从输入文件中读取另一行
- 更改.cpp程序的输入文件中数据的位置会意外更改输出
- 获取通过重定向传入的输入文件的名称?
- C++ 如何打开带有另一个目录的输入文件?
- C++模板编程设计问题 - 根据输入文件返回不同的类型
- 如何从输入文件 c++ 创建随机名称生成器
- 从输入文件修剪空格
- 链接器输入文件未使用,因为链接未完成,我无法获得.o
- 我正在尝试从输入文件中读取,然后使用它们的子字符串比较字符串的特定部分
- 我遇到使用 c++ 逐行读取输入文件的问题
- 使用重定向命令从 stdin 读入的字符串"<"输入文件未正确附加
- 使用 getline 从输入文件打印时如何忽略空白行
- 如何按升序对输入文件中的数字进行排序,并找到它们的范围和中值
- 数组大小由输入文件中的行数定义
- 从C++输入文件读取
- 在课堂上创建了一个朋友,给出"无输入文件"错误
- 通过显示一行星号来创建条形图,该条形图将读取数据的输入文件
- 利用输入文件中的数据(字符串和int)并在循环中利用
- C++ 仅读取输入文件中的部分(不是全部)数据以添加到记录中
- 如何从输入文件中读取字符并将其存储到向量中?