当Ruby中的system()调用GCC时,它不会编译

时间:2016-11-02 15:26:26

标签: c ruby linux gcc

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

1 个答案:

答案 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