g++ 不适用于 Java

g++ doesn't work with Java

我正在编写 Java 程序编译代码。

所以用户可以选择要编译的文件,然后程序自己g++运行。

在网上查看,特别是 Whosebug,我决定使用以下代码:

//Set a FileChoose called fc, got the file path (filePath) and the directory path (dirPath), then:
ProcessBuilder process=null;
try {
    process = new ProcessBuilder("g++", filePath, " -o "+dirPath+"/a.out").start();
} catch (IOException ex) {
    System.err.println("Error compiling file");
    Logger.getLogger(Nuovo.class.getName()).log(Level.SEVERE, null, ex);
    System.exit(0);
}

重点是它 return 没有任何错误,当我检查文件是否已编译时,什么也没有。

有什么想法吗?

非常感谢!

我建议你阅读程序的输出,看看它产生了什么错误。

我猜它会说类似的话。

File not found:  -o dir/a.out

请注意,您已指定 " -o "+dirPath+"/a.out" 是单个参数。这就像写

g++ $filePath ' -o dir/a.out'

也许您的本意是

new ProcessBuilder("g++", filePath, "-o", dirPath+"/a.out").start();

为什么 Java 不像 shell 那样解析你的论点?因为它将参数传递给系统调用 exec 所以它实际上没有做任何 C++ 不会做的事情。

您应该使用位于 https://commons.apache.org/proper/commons-exec/download_exec.cgi 的 apache commons exec 库。 java 进程 exec 有一些主要的缺陷:如果本机命令向您发送消息,java 进程将不会解析该消息,并且还会阻止 java 程序的执行。

示例:

  • 您从 java 调用以下命令:del .
  • 系统会发回确认信息:Are you sure (Y/N)?
  • javaProcessBuilder 不会解析确认消息,它会阻止程序的执行。

出于这个原因,我推荐 apache commons exec 库,它也有很好的文档 https://commons.apache.org/proper/commons-exec/tutorial.html