3

javacode を使用して C プログラムをコンパイルしようとしています。私は次のようにしました。

    Process process = Runtime.getRuntime().exec("C:/cygwin/bin/sh -c 'gcc HelloWorld.c -o HelloWorld.exe'");

    InputStream is = process.getInputStream();
    InputStreamReader isr = new InputStreamReader(is);
    BufferedReader br = new BufferedReader(isr);
    String line, log;
    log ="\n..Input..\n";
    while ((line = br.readLine()) != null) {
      log+=line;
      log+="\n";
    }

    InputStream is2 = process.getErrorStream();
    InputStreamReader isr2 = new InputStreamReader(is2);
    BufferedReader br2 = new BufferedReader(isr2);
    String line2;
    log+="\n..Error..\n";
    while ((line2 = br2.readLine()) != null) {
      log+=line2;
      log+="\n";
    }
    System.out.println(log);

HelloWorld.exe が作成されず、以下のエラーメッセージが表示されました。/usr/bin/sh: gcc: コマンドが見つかりません

4

3 に答える 3

2

問題の 1 つはexec(String)、文字列を単純に空白文字で引数に分割することです。そのための分割を行う必要があります。次のように記述しexecます。

Process process = Runtime.getRuntime().exec(new String[]{
     "C:/cygwin/bin/sh",
      "-c",
      "gcc HelloWorld.c -o HelloWorld.exe"});

このexec(String)メソッドは、引用符やリダイレクトなどのシェル構文を認識しません。

gccコマンドにフルパス名を使用する必要があるかもしれませんが、それは疑わしいです。シェルは JVM から環境変数設定を継承する必要があり、おそらく適切なPATH変数が含まれています。

于 2012-06-26T09:18:03.573 に答える
0

試す

/usr/bin/gcc

それよりも

gcc

たとえば、スクリプトでバイナリ呼び出しにフル パスを使用します。

于 2012-06-26T09:11:36.190 に答える
0

現在のランタイム環境を取得し、exec メソッドを呼び出すことができます。次に例を示します。

String cmd="C:/cygwin/bin/sh -c '/usr/bin/gcc HelloWorld.c -o HelloWorld.exe'"; Process process = Runtime.getRuntime().exec(cmd);

于 2012-06-26T09:10:26.587 に答える