我试图从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
任何人都可以帮忙吗?
答案 0 :(得分:4)
g++
通常是g++-3
或g++-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)
我认为javac
和java
不是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);