我有一个在 Windows 上开发的 Java 项目。现在,我想让它独立于平台。
项目的一部分是:它采用一个程序并执行。从文件获取输入并在文件中给出输出,然后将输出文件与另一个文件进行比较并给出结果。
首先,我有一个运行.cpp
文件并生成可执行文件的类。据我所知,这项工作的命令在 Windows 和 Ubuntu 中是相同的,即:
g++ -std=c++11 -o <name of executable file> <path of .cpp file>
使用上述命令,它在终端上运行良好。但在代码中实现同样的事情时,它会出现编译错误。这意味着以下错误:
g++: fatal error: no input files
看图更清楚:
我的代码:
package judgecpp;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.file.Path;
import java.nio.file.Paths;
class CodeCompile implements Runnable, RunInCmd {
Thread compilerThread;
private final File fileCPP;
public File file;
public boolean errorHas;
public CodeCompile(File fileCPP) {
this.fileCPP = fileCPP;
file = new File(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);
}
}
}
我在这里堆放已久。
更新:
我找到了解决方案,但不知道它为什么有效。下面这行代码可以替代:
String command = String.format("g++ -std=c++11 -o \"" + file.toString() + "\" \"" + fileCPP.toString() + "\"");
我使用了以下行:
String command = String.format("cmd /c \"g++ -std=c++11 -o \"" + file.toString() + "\" \"" + fileCPP.toString() + "\"\"");
这意味着生成的字符串将如下所示:
cmd /c "g++ -std=c++11 -o "compiledFile0" "Submissions/20_masd_0_2015_09_14_01_09_58.cpp""
但是在运行程序时,以下字符串均不起作用:
首先(这个在终端上运行良好):
"./compiledFile0"<"/home/mamun/Desktop/ContestSettings/icpc2015-data/artichoke/12.in">"output1.txt"
第二:
cmd /c ""./compiledFile0"<"/home/mamun/Desktop/ContestSettings/icpc2015-data/artichoke/12.in">"output1.txt""
第三:
cmd /c ""compiledFile0"<"/home/mamun/Desktop/ContestSettings/icpc2015-data/artichoke/12.in">"output1.txt""
第四:
"compiledFile0"<"/home/mamun/Desktop/ContestSettings/icpc2015-data/artichoke/12.in">"output1.txt"
但这次没有运气,需要帮助。