GCC在使用命令行调用时编译我的C脚本
app.user
。我在Ruby中写了一个脚本,第36行说gcc main.c -o bfcout
。我也试过system("gcc main.c -o bfcout")
。
但我收到错误:bash -c #{Shellwords.escape("gcc -Wall #{filename}.c -o bfcompoutput")}
有一个main()函数,正如我所说,在命令行上编译工作!这有什么不对?
编辑: C文件看起来像这样。它由脚本生成。是的,它是对Brainf ***的引用。很抱歉有很多行(以及格式错误)。
/usr/lib/gcc/x86_64-pc-linux-gnu/6.2.1/../../../../lib/crt1.o: In function '_start':
(.text+0x20): undefined reference to 'main'
Ruby中的脚本:
#include <stdio.h>
unsigned char _c[30000]={};
int ptr=0;
int main(){
++_c[ptr];
++_c[ptr];
++_c[ptr];
++_c[ptr];
++_c[ptr];
++_c[ptr];
++_c[ptr];
++_c[ptr];
++_c[ptr];
++_c[ptr];
while (_c[ptr]) {
++ptr;
++_c[ptr];
++_c[ptr];
++_c[ptr];
++_c[ptr];
++_c[ptr];
++_c[ptr];
++_c[ptr];
++ptr;
++_c[ptr];
++_c[ptr];
++_c[ptr];
++_c[ptr];
++_c[ptr];
++_c[ptr];
++_c[ptr];
++_c[ptr];
++_c[ptr];
++_c[ptr];
++ptr;
++_c[ptr];
++_c[ptr];
++_c[ptr];
++ptr;
++_c[ptr];
--ptr;
--ptr;
--ptr;
--ptr;
--_c[ptr];
}
++ptr;
++_c[ptr];
++_c[ptr];
putchar(_c[ptr]);
++ptr;
++_c[ptr];
putchar(_c[ptr]);
++_c[ptr];
++_c[ptr];
++_c[ptr];
++_c[ptr];
++_c[ptr];
++_c[ptr];
++_c[ptr];
putchar(_c[ptr]);
putchar(_c[ptr]);
++_c[ptr];
++_c[ptr];
++_c[ptr];
putchar(_c[ptr]);
++ptr;
++_c[ptr];
++_c[ptr];
putchar(_c[ptr]);
--ptr;
--ptr;
++_c[ptr];
++_c[ptr];
++_c[ptr];
++_c[ptr];
++_c[ptr];
++_c[ptr];
++_c[ptr];
++_c[ptr];
++_c[ptr];
++_c[ptr];
++_c[ptr];
++_c[ptr];
++_c[ptr];
++_c[ptr];
++_c[ptr];
putchar(_c[ptr]);
++ptr;
putchar(_c[ptr]);
++_c[ptr];
++_c[ptr];
++_c[ptr];
putchar(_c[ptr]);
--_c[ptr];
--_c[ptr];
--_c[ptr];
--_c[ptr];
--_c[ptr];
--_c[ptr];
putchar(_c[ptr]);
--_c[ptr];
--_c[ptr];
--_c[ptr];
--_c[ptr];
--_c[ptr];
--_c[ptr];
--_c[ptr];
--_c[ptr];
putchar(_c[ptr]);
++ptr;
++_c[ptr];
putchar(_c[ptr]);
++ptr;
putchar(_c[ptr]);
++_c[ptr];
++_c[ptr];
++_c[ptr];
putchar(_c[ptr]);
return 0;
}
答案 0 :(得分:2)
缓冲写入文件流,您需要在编译C文件之前刷新缓冲区。改变这个
File.open("#{filename}.c","w").write(ostr)
到这个
File.open("#{filename}.c","w") { |f| f.write(ostr) }
块形式自动关闭文件流,刷新写入。
修改强>
更好的方法是将代码直接写入gcc而不将其保存到中间文件中。
IO.popen("gcc -Wall -o ./#{filename} -xc -", 'w') { |io| io.write(ostr) }
如果您想要更多地控制子流程,请查看open3。