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:
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.
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.