Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using gcc directly with ProcessBuilder creates no output files

I'm trying to compile C source file with gcc using ProcessBuilder. I managed to make it running but there is no output file.

Here is my code (based on this answer) :

public void compileWithGccNoCmd(Path sourcePath) throws IOException {
        String sourcePathString = sourcePath.toString();
        String outputPathString = sourcePath.getParent().toString() + "\\" + Files.getNameWithoutExtension(sourcePath.toString());

        try {
            ProcessBuilder pb = new ProcessBuilder("gcc", "-fprofile-arcs -ftest-coverage -o " + outputPathString,  sourcePathString);
            pb.directory(sourcePath.getParent().toFile()); // this was added later
            Process compile = pb.start();

            compile.waitFor();

            if (compile.exitValue() == -1) {
                // if error
                System.out.print("COMPILE ERROR");
            }

        } catch (InterruptedException e) {
            e.printStackTrace();
        }

}

My first thought that it has something to do with the working directory so I add pb.directory() but the output file still not there.

Since I can't find any solution to this, I tried another way by running gcc with cmd. I set the working directory to make sure the output files on the right place. This is the alternative code (based on this answer):

public void compileWithGcc(Path sourcePath) throws IOException {
        String sourcePathString = sourcePath.toString();
        String outputPathString = sourcePath.getParent().toString() + "\\" + Files.getNameWithoutExtension(sourcePath.toString());

        ProcessBuilder pb;
        try {
            pb = new ProcessBuilder("cmd", "/C", "gcc " + sourcePathString + " -o " + outputPathString + " -fprofile-arcs -ftest-coverage");

            pb.directory(sourcePath.getParent().toFile());
            Process p = pb.start();
            p.waitFor();
            int x = p.exitValue();

        } catch (Exception ex) {
            ex.printStackTrace();
        }
}

For some reason it works! Why is this happened? I'm pretty sure both is running gcc with the same parameter

like image 735
AceVez Avatar asked Feb 15 '26 21:02

AceVez


1 Answers

This line:

ProcessBuilder pb = new ProcessBuilder("gcc", "-fprofile-arcs -ftest-coverage -o " + outputPathString,  sourcePathString)

needs to look like this:

ProcessBuilder pb = new ProcessBuilder("gcc", "-fprofile-arcs", "-ftest-coverage", "-o", outputPathString,  sourcePathString)

What you are doing with the first line is passing two arguments to gcc, one of which is "-fprofile-arcs -ftest-coverage -o " + outputPathString, instead of passing the five arguments of my edited line. gcc won't understand that.

When you use cmd like you did, it parses the command that you gave it and passes the arguments correctly, that's why it works.

like image 170
kutschkem Avatar answered Feb 17 '26 10:02

kutschkem



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!