Невозможно вызвать "gcc" изнутри программы Java - PullRequest
3 голосов
/ 20 августа 2011

Я пытаюсь вызвать компилятор GNU C из Java-программы для компиляции файла 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 ]

4 голосов
/ 27 августа 2011

g++ в Cygwin обычно является символической ссылкой на g++-3 или g++-4, но символические ссылки Cygwin не прозрачны для не-Cygwin программ. Поэтому вам нужно напрямую вызвать цель символической ссылки.

1 голос
/ 20 августа 2011

Убедитесь, что вы запускаете java-приложение через cygwin, а не просто обычную командную оболочку Windows.Кроме того, попробуйте выполнить команду самостоятельно, чтобы убедиться, что она работает.

И, наконец, это может быть неприменимо к вашей проблеме, но вы должны прочитать знаменитую статью , когда Runtime.exec () победил't в любом случае.

0 голосов
/ 27 августа 2011

Я не думаю, что javac и java являются исполняемыми файлами Cygwin (т.е. они не используют cygwin1.dll), поэтому они не будут распознавать специфичные для Cygwin пути к файлам. Вы можете выполнить их из оболочки 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);
0 голосов
/ 20 августа 2011

Попробуйте обернуть это следующим образом:

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);}
        } 
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...