gpt4 book ai didi

c - GCC 在 Ruby 中被 system() 调用时不编译

转载 作者:数据小太阳 更新时间:2023-10-29 08:59:15 26 4
gpt4 key购买 nike

GCC 在命令行上调用时编译我的 C 脚本gcc main.c -o bfcout。我用 Ruby 写了一个脚本,第 36 行说 system("gcc main.c -o bfcout")。我还尝试了 bash -c#{Shellwords.escape("gcc -Wall #{filename}.c -o bfcompoutput")}

但是我得到一个错误:/usr/lib/gcc/x86_64-pc-linux-gnu/6.2.1/../../../../lib/crt1.o: In函数“_start”:
(.text+0x20): 对“main”的 undefined reference

有一个 main() 函数,正如我所说,在命令行上编译是可行的!这里有什么问题?

编辑:C 文件看起来像这样。它是由脚本生成的。是的,它是对 Brainf*** 的引用。抱歉有很多行(以及错误的格式)。

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

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

最佳答案

写入文件流是有缓冲的,你需要在编译 C 文件之前刷新缓冲区。改变这个

File.open("#{filename}.c","w").write(ostr)

对此

File.open("#{filename}.c","w") { |f| f.write(ostr) }

block 形式自动关闭文件流,刷新写入。

编辑:

一个更好的方法是直接将代码写入 gcc,而不将其保存到中间文件。

IO.popen("gcc -Wall -o ./#{filename} -xc -", 'w') { |io| io.write(ostr) }

如果您想对子流程进行更多控制,请查看 open3 .

关于c - GCC 在 Ruby 中被 system() 调用时不编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40383751/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com