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

一个问题是exec(String)在空白字符处天真地将字符串拆分为参数。您需要为它进行拆分。写exec为:

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

exec(String)方法不理解 shell 语法,例如引用和重定向。

可能还需要为gcc命令使用完整路径名,但我对此表示怀疑。shell 应该从 JVM 继承环境变量设置,这可能包括一个合适的PATH变量。

于 2012-06-26T09:18:03.573 回答
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 回答
0

尝试

/usr/bin/gcc

而不是

gcc

比如说,在脚本中使用二进制调用的完整路径。

于 2012-06-26T09:11:36.190 回答