GCC没有';在Ruby中被system()调用时无法编译
当在命令行上调用我的C脚本时,GCC使用GCC没有';在Ruby中被system()调用时无法编译,c,ruby,linux,gcc,C,Ruby,Linux,Gcc,当在命令行上调用我的C脚本时,GCC使用 gcc main.c-o bfcout。我用Ruby编写了一个脚本,其中第36行写着系统(“gcc main.c-obfcout”)。我还尝试了bash-c{Shellwords.escape(“gcc-Wall{filename}.c-obfcomcompoutput”)} 但是我得到一个错误:/usr/lib/gcc/x86_64-pc-linux-gnu/6.2.1/../../../../../../../../lib/crt1.o:在函数“\u
gcc main.c-o bfcout
。我用Ruby编写了一个脚本,其中第36行写着系统(“gcc main.c-obfcout”)
。我还尝试了bash-c{Shellwords.escape(“gcc-Wall{filename}.c-obfcomcompoutput”)}
但是我得到一个错误:/usr/lib/gcc/x86_64-pc-linux-gnu/6.2.1/../../../../../../../../lib/crt1.o:在函数“\u start”中:
(.text+0x20):未定义对“main”的引用
有一个main()函数,正如我所说的,在命令行上编译是有效的!这里怎么了
编辑:
C文件看起来像这样。它是由脚本生成的。是的,这是对Brainf***的引用。很抱歉,行太多(格式也不好)
#包括
无符号字符_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];
而(_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]);
返回0;
}
Ruby脚本:
require 'shellwords'
code = ""
loop do
x = gets.chomp
break if x=="__END__"
code << x
end
code_arr = []
code.split("").each {|ch|
case ch
when ">";code_arr << "++ptr;"
when "<";code_arr << "--ptr;"
when "+";code_arr << "++_c[ptr];"
when "-";code_arr << "--_c[ptr];"
when ".";code_arr << "putchar(_c[ptr]);"
when ",";code_arr << "_c[ptr] = getchar();"
when "[";code_arr << "while (_c[ptr]) {"
when "]";code_arr << "}"
end
}
filename = "main"
sp = ""
ostr = "#include <stdio.h>\nunsigned char _c[30000]={};#{sp}int ptr=0;#{sp}int main(){#{code_arr.join(sp)+sp}return 0;#{sp}}"
File.open("#{filename}.c","w").write(ostr)
puts ostr
result = system("gcc -Wall #{filename}.c -o ./#{filename}")
puts "Process exited with code #{result}"
需要“shellwords”
code=“”
环道
x=get.chomp
如果x==“\uuuu结束\uuuuuu”则中断
代码写入文件流是缓冲的,您需要在编译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) }
如果您想对子流程进行更多控制,请签出。您介意发布您的.c文件吗?真奇怪!在告诉你一些事情之前,我会尝试在这里重现错误。我在这里重复了同样的错误,并且编译正确。我想你的安装有问题。您是否安装了所有的构建工具?它在交互式bash/sh中工作。因此,似乎所有的东西都已安装。@EddeAlmeida是否也要在Ruby中查看脚本?好的!还有一个问题:File.open(“#{filename}.c”,“w”).write(ostr).close是否也有效?否,write返回读取的字节数,因此您将得到一个NoMethodError
。另请参见我的编辑。
IO.popen("gcc -Wall -o ./#{filename} -xc -", 'w') { |io| io.write(ostr) }