【问题标题】:Running a c/c++ program from java through command line通过命令行从 java 运行 c/c++ 程序
【发布时间】:2012-06-29 20:10:51
【问题描述】:

我已经编写了一个编译和执行 C、c++、java 程序的 java 程序。我首先对它进行了 java 测试,它工作得非常好。然后我对它进行了 C 测试,但它给出了错误。请告诉我需要做什么..这是编译代码的模块..:

public void compileCode(String path,String lang)throws IOException
    {
        String cmd="";
        if(lang.equals("c")||lang.equals("cpp"))
            cmd="g++ Main"+threadNum+"."+lang+" -o "+threadNum;
        else if(lang.equals("java"))
            cmd="javac Main"+threadNum+".java";

        Process p=Runtime.getRuntime().exec(cmd,null,new File(path));

         String s=null;
        BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream()));
        while ((s = stdError.readLine()) != null) {
            msg+=s+"\n";
            res=0;
        }
        if(res!=0)
            processCode(path,lang);
    }

错误是:

Exception in thread "main" java.io.IOException: Cannot run program "g++" (in directory "C:\wamp\www\usercodes\lokesh"): CreateProcess error=2, The system cannot find the file specified
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
    at java.lang.Runtime.exec(Runtime.java:615)
    at java.lang.Runtime.exec(Runtime.java:448)
    at Contest.compileCode(Main.java:164)
    at Contest.makeFile(Main.java:154)
    at Contest.main(Main.java:52)
    at Main.main(Main.java:14)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:1

20)

【问题讨论】:

  • 你不想为 C 使用 gcc(而不是 g++)吗?
  • 一个愚蠢的问题,但是 g++ 在路上吗?
  • 我可以从命令 promt 运行 g++ filename.c -o 文件。还有什么我需要的吗? C:\wamp\www\usercodes\lokesh>echo %PATH% C:\Program Files (x86)\Java\jdk1.7.0\bin;C:\Program Files (x86)\CodeBlocks\MinGW \bin
  • 这与您的问题无关,但为什么要这样做?

标签: java command-prompt


【解决方案1】:

要使“g++”工作,Windows 的 PATH 上必须有一个 g++.exe。如果它是“g++.bat”或“g++.cmd”,则必须使用确切的名称调用 Runtime.exec。

【讨论】:

  • 不..我在路径上有一个 g++.exe ..但它仍然有效..但是如果任何其他命令(不是必需的)g++ 可以做到这一点,你也可以告诉我
  • Runtime.exec 附加“.exe”来查找并启动一个没有扩展名的可执行文件。但 Runtime.exec 不会尝试 cmd 或 bat 扩展。你确定有 g++.exe 吗?
  • 是的,我确定..如果你不相信你可以看到我的屏幕link
  • 很好;-)。你有你的jdk 7的来源吗?然后看看 ProcessBuilder Line 1029。这就是你的异常的来源。
  • 这里是:[link]hg.openjdk.java.net/jdk7/jdk7-gate/jdk/file/e947a98ea3c1/src/… 但是我认为C编译器有问题,因为java程序运行良好
【解决方案2】:

我改用了 process Builder,它成功了。无论如何,谢谢你的时间 :) 这是代码...

public void compileCode(String path,String lang)throws IOException,InterruptedException
    {
        String cmd="";
        if(lang.equals("c")||lang.equals("cpp"))
            cmd="g++ "+path+"Main"+threadNum+"."+lang+" -o "+threadNum;
        else if(lang.equals("java"))
            cmd="javac Main"+threadNum+".java";
        ProcessBuilder process=new ProcessBuilder();
        process.directory(new File(path));
        process.command(new String[]{"cmd","/c",cmd});
        Process p=process.start();
        String s=null;
        BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream()));
        while ((s = stdError.readLine()) != null) {
            msg+=s+"\n";
            res=0;
        }
        if(res!=0)
            processCode(path,lang);
    }

【讨论】:

  • 在这个版本中 cmd.exe 找到并启动 g++。只是为了指出区别。
  • 但不幸的是我在这里遇到了问题。在我运行代码的下一个模块中,.exe 文件在我使用时不会破坏:ProcessBuilder process=new ProcessBuilder();process.directory(new File(path));Process p=process.start(); p.destroy();
  • 好吧..我发现这个进程没有破坏,因为这个进程实际上是 cmd 并且正在创建一个我没有破坏的子进程..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多