2011-08-20 25 views
3

我试图调用Java程序编译C++文件的GNU C编译器内部称之为“海湾合作委员会”,但我得到一个错误:无法从Java程序

这里是程序

class HelloWorld { 
public static void main(String[] args) { 
Runtime sys = Runtime.getRuntime(); 
System.out.println("Hello World!"); 
try { 
    String com = "g++ NB.cpp -o NNN"; 
    System.out.println(com); 
    Process p = sys.exec(com); 
} 
catch (Exception ep) { 
    System.err.println(ep);} 
} 
} 

这里是我所得到的,当我编译器和运行程序

$javac HelloWorld.java 
$java HelloWorld 
Hello World! 
gcc NB.cpp -o NB 
java.io.IOException: Cannot run program "g++": CreateProcess error=5, Access is denied 

这里就是GCC是驻留

$ which gcc 
/usr/bin/gcc 

在这里,如果路径

$ echo $PATH 
/usr/local/bin:/usr/bin:/cygdrive/c/Program Files/Java/jdk1.6.0_26/bin:/cygdrive/c/Program Files (x86)/MiKTeX 2.9/miktex/bin:/cygdrive/c/Windows/system32:/cygdrive/c/Windows:/cygdrive/c/Windo 
ws/System32/Wbem:/cygdrive/c/Windows/System32/WindowsPowerShell/v1.0:/cygdrive/d/SourceForge/vectorpascalcom: D:/Cygwin/bin:/cygdrive/d/make382:/cygdrive/d/usr/bin:/cygdrive/d/Program Files/TortoiseSV 
N/bin:/cygdrive/d/SourceForge/vectorpascalcom:/usr/bin:/cygdrive/c/Program Files/Java/jdk1.6.0_26/bin 

任何一个可以帮助的内容是什么?

+0

这是最有可能是权限问题。这个想法应该可行,但很有可能你的JVM没有权利调用g ++。尝试运行另一个可执行文件并观察输出。 –

+0

尝试使用绝对路径为g ++,而不是依靠路径 – BegemoT

+0

我试过绝对路径,但问题依然存在! – You

回答

0

尝试用这种包装它:

java.security.AccessController.doPriveleged(new java.security.PrivilegedAction() { 
    public Object Run() { 
     Runtime sys = Runtime.getRuntime(); 
     System.out.println("Hello World!"); 
     try { 
      String com = "g++ NB.cpp -o NNN"; 
      System.out.println(com); 
      Process p = sys.exec(com); 
     } 
     catch (Exception ep) { 
      System.err.println(ep);} 
     } 
    } 
} 
+0

这不会帮助,因为问题是从Windows运行* cygwin *程序。 – maaartinus

1

确保你正在运行的cygwin通过Java应用程序,而不是只是一个普通的Windows命令外壳。另外,请尝试单独运行该命令以确保其正常工作。

最后,这可能不适用于您的问题,但您应该阅读着名文章when Runtime.exec() won't

+0

谢谢Daniel, – You

+0

那么, 我正在通过Cygwin运行它。 Cygwin自带的“gcc NP.cpp -o NN”表现很好,但不是来自Java程序。 – You

+0

您是否尝试过您的程序正在运行的命令? G ++不是gcc。 – Jon7

4

g++ Cygwin通常是符号链接到g++-3g++-4,但Cygwin符号链接对非Cygwin程序不透明。因此你需要直接调用符号链接目标。

+0

就是这样 - 至少在我的电脑上。这里的目标是'/ etc/alternatives/g ++',没有任何扩展名,所以它可能无法在Windoze上执行。制作一个名为'g ++。exe'的副本使我进一步了解了另一个可能特定于XP 64的问题。 – maaartinus

+0

啊,是的,我忘了那件事;/etc/alternatives/g ++是另一个符号链接。制作副本当然会起作用,但缺点是在更新时可能会出现不一致。 – ak2

+0

你是对的,制作副本是错误的。符号链接指向'/ usr/bin/g ++ - 4.exe',但是我看不到与'/ usr/bin'对应的Windows目录。最后,我找到了'C:\ Programs \ cygwin \ bin \ g ++ - 4.exe',它在没有给出输入文件时发出抱怨,但是根本没有任何内容。奇怪。 – maaartinus

0

我不认为javacjava是Cygwin的可执行文件(即不使用cygwin1.dll),所以他们不会承认Cygwin的特定文件路径。您可以从Cygwin shell执行它们,但您可以对其他任何非Cygwin Windows可执行文件执行相同的操作。就您的Java进程而言,g++不是/usr/bin/g++,因为没有/usr/bin目录。 (/usr/bin实际上是一个Cygwin的安装点;相应的Windows目录是C:\cygwin\bin

试试这个:

String com = "C:\\cygwin\\bin\\sh -c 'g++ NB.cpp -o NNN'"; 
System.out.println(com); 
Process p = sys.exec(com);