无法从Java程序中调用“gcc”

时间:2011-08-20 14:43:30

标签: java cygwin

我试图从Java程序调用GNU C编译器来编译c ++文件,但是我收到一个错误:

这是程序

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

这里如果是PATH的内容

$ 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

任何人都可以帮忙吗?

4 个答案:

答案 0 :(得分:4)

Cygwin中的

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

答案 1 :(得分:1)

确保您通过cygwin运行java应用程序而不仅仅是普通的Windows命令shell。另外,尝试自己运行命令以确保它正常工作。

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

答案 2 :(得分: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);}
        } 
    }
}

答案 3 :(得分: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);