A mesma coisa funciona no terminal, mas não no java Runtime ao usar o Ubuntu 14.04 LTS

1

Eu tenho um projeto Java que desenvolvi no Windows. Agora, quero tornar a plataforma independente.

Uma parte do projeto é: leva um programa c e é executado. pega a entrada do arquivo e dá saída no arquivo, compara o arquivo de saída com outro arquivo e fornece um resultado.

No começo eu tenho uma classe que executa o arquivo .cpp e produz o arquivo executável. Até onde eu sei, o comando para este trabalho é o mesmo em ambas as janelas e no ubuntu e isso é:

g++ -std=c++11 -o <name of executable file> <path of .cpp file>

Usando o comando acima, funciona bem usando terminal. Mas ao implementar a mesma coisa no código, está dando erro de compilação. Isso significa os seguintes erros:

g++: fatal error: no input files

Veja a imagem para ficar mais clara:

Meucódigo:

packagejudgecpp;importjava.io.BufferedReader;importjava.io.File;importjava.io.IOException;importjava.io.InputStreamReader;importjava.nio.file.Path;importjava.nio.file.Paths;classCodeCompileimplementsRunnable,RunInCmd{ThreadcompilerThread;privatefinalFilefileCPP;publicFilefile;publicbooleanerrorHas;publicCodeCompile(FilefileCPP){this.fileCPP=fileCPP;file=newFile(String.format("compiledFile%d", CodeProcessing.getNewFileNumber()));
        compilerThread = new Thread(this, "compilerThread");
    }

    @Override
    public Process cmdRun(String command) throws IOException {
        Runtime rt;
        Process pr;
        rt = Runtime.getRuntime();
        pr = rt.exec(command);
        return pr;
    }

    @Override
    public void run() {

        try {
            String command = String.format("g++ -std=c++11 -o \"" + file.toString() + "\" \"" + fileCPP.toString() + "\"");
//            if(VerdictGiver.os.equals("uni")) command = String.format("g++ -std=c++11 \"" + fileCPP.toString() + "\" -o \"" + file.toString() + "\"");
//            command = "pwd";
            System.out.println("Code Compile: "+command);
            System.out.println("OS: "+VerdictGiver.os);
            Process pr = cmdRun(command);
            Path currentRelativePath = Paths.get("");
            String s = currentRelativePath.toAbsolutePath().toString();
            System.out.println("Current relative path is: " + s);
            BufferedReader input = new BufferedReader(new InputStreamReader(pr.getErrorStream()));

            errorHas = false;
            System.out.println("Compile Error Stream starts -----------------------------------------");
            while (input.readLine() != null) {
                System.out.println(input.readLine());
                errorHas = true;
            }
            System.out.println("Compile Error Stream ends -------------------------------------------");
        } catch (IOException ex) {
//            Logger.getLogger(CodeCompile.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

Estou empilhado aqui por um longo tempo.

Atualização:

Eu tenho a solução, mas não sei porque funciona. Em vez de linha:

String command = String.format("g++ -std=c++11 -o \"" + file.toString() + "\" \"" + fileCPP.toString() + "\"");

Eu usei a seguinte linha:

String command = String.format("cmd /c \"g++ -std=c++11 -o \"" + file.toString() + "\" \"" + fileCPP.toString() + "\"\"");

Isso significa que a string gerada seria como:

cmd /c "g++ -std=c++11 -o "compiledFile0" "Submissions/20_masd_0_2015_09_14_01_09_58.cpp""

Mas, no caso de executar o programa, nenhuma das seguintes strings está funcionando:

Primeiro(estefuncionabemnoterminal):

"./compiledFile0"<"/home/mamun/Desktop/ContestSettings/icpc2015-data/artichoke/12.in">"output1.txt"

Segundo:

cmd /c ""./compiledFile0"<"/home/mamun/Desktop/ContestSettings/icpc2015-data/artichoke/12.in">"output1.txt""

Terceiro:

cmd /c ""compiledFile0"<"/home/mamun/Desktop/ContestSettings/icpc2015-data/artichoke/12.in">"output1.txt""

Quarto:

"compiledFile0"<"/home/mamun/Desktop/ContestSettings/icpc2015-data/artichoke/12.in">"output1.txt"

Mas desta vez sem sorte, preciso de ajuda.

    
por Enamul Hassan 13.09.2015 / 20:01

0 respostas