2016-11-02 3 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")}を試しました。 /usr/lib/gcc/x86_64-pc-linux-gnu/6.2.1/../../../../lib/crt1.o: In function '_start': (.text+0x20): undefined reference to 'main'Rubyでsystem()によって呼び出されたときにGCCがコンパイルされない

は、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

本当に奇妙です!あなたに何かを伝える前に、ここでエラーを再現しようとします。 –

+0

私はここで全く同じことを繰り返し、正確にコンパイルしました。あなたのインストールに何か問題があると仮定しています。すべてのビルドツールがインストールされていますか? –

答えて

2

、あなたはCファイルをコンパイルする前にバッファをフラッシュする必要があります。この

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

ブロック形式にこの

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

が自動的に書き込みをフラッシュし、ファイルストリームを閉じて変更します。

編集:

これを行うためのよりよい方法は、中間ファイルに保存せずに、GCCに直接コードを記述することです。

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

サブプロセスをさらに制御したい場合は、open3をチェックしてください。

+0

OK!もう1つの質問: 'File.open("#{filename} .c "、" w ")。write(ostr).close'も有効でしょうか? – Sessho

+0

いいえ、writeは読み取られたバイト数を返しますので、 'NoMethodError'を取得します。私の編集も見てください。 – Max

関連する問題