2016-11-02 25 views
2

GCC在命令行上使用 gcc main.c -o bfcout調用它時會編譯我的C腳本。我在Ruby中寫了一個腳本,其中第36行表示system("gcc main.c -o bfcout")。我也試過bash -C#{Shellwords.escape("gcc -Wall #{filename}.c -o bfcompoutput")}在Ruby中由system()調用GCC時不會編譯

但我得到一個錯誤:/usr/lib/gcc/x86_64-pc-linux-gnu/6.2.1/../../../../lib/crt1.o: In function '_start': (.text+0x20): undefined reference to 'main'

有一個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}" 
+0

你介意發佈你的.c文件嗎? –

+0

真奇怪!在告訴你一些事情之前,Il試圖重現錯誤。 –

+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

+0

行!還有一個問題:File.open(「#{filename} .c」,「w」).write(ostr).close'也是有效的嗎? – Sessho

+0

不,寫入會返回讀取的字節數,所以您會得到一個'NoMethodError'。另請參閱我的編輯。 – Max