2

I have written a java program that compiles and executes C,c++,java programs ..I firstly tested it for java and it worked absolutely fine. Then I tested it for C but it gave errors.Please tell what I need to do..Here is the module which compiles the code..:

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);
    }

And the error is :

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)
4
  • 1
    Don't you want to use gcc for C (instead of g++)? Commented Jun 29, 2012 at 20:13
  • 1
    A silly question, but is g++ on the path? Commented Jun 29, 2012 at 20:14
  • I can run the g++ filename.c -o file from the command promt . Is there anything else I need ? C:\wamp\www\usercodes\lokesh>echo %PATH% C:\Program Files (x86)\Java\jdk1.7.0\bin;C:\Program Files (x86)\CodeBlocks\MinGW \bin Commented Jun 29, 2012 at 20:22
  • This isn't really relevant to your question, but why do this? Commented Jun 29, 2012 at 22:39

2 Answers 2

2

For "g++" to work, there has to be a g++.exe on the PATH for windows. If it is a "g++.bat" or "g++.cmd", you have to call Runtime.exec with the exact name.

Sign up to request clarification or add additional context in comments.

8 Comments

No..I have a g++.exe on the path ..But its still dosent work..But if any other command(not necessay) g++ can do the trick u can tell me that also
Runtime.exec appends ".exe" to find and start an executable that was given without extension. But Runtime.exec does not try the cmd or bat extension. Are you shure there is a g++.exe?
Yes I am sure..If u dont believe u can see my screenlink
fine ;-). Do you have Sources for your jdk 7? Then have a look at ProcessBuilder Line 1029. That's where your exception comes from.
here it is:[link]hg.openjdk.java.net/jdk7/jdk7-gate/jdk/file/e947a98ea3c1/src/… But I think there is a problem with the C compiler because java programs are running fine
|
0

I used process Builder instead and it worked out..Anyways thnx for ur time :) Here's the code...

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);
    }

3 Comments

in this version cmd.exe finds and starts g++. just to point out the difference.
But unfortunately I have a problem here.. In the next module where I run the code , the .exe file does not destroy when I use this: ProcessBuilder process=new ProcessBuilder();process.directory(new File(path));Process p=process.start(); p.destroy();
Ok ..I found out that this process is not destrying because the process is actually cmd and that is creating a subprocess which I am not destroying..

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.