Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GCC没有';在Ruby中被system()调用时无法编译_C_Ruby_Linux_Gcc - Fatal编程技术网

GCC没有';在Ruby中被system()调用时无法编译

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

当在命令行上调用我的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 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) }