Запуск с ++ из Java проблемы - PullRequest
0 голосов
/ 28 июля 2010

Мне нужно скомпилировать и запустить программу на С ++ из Java. Я использую

Обработка a = Runtime.getRuntime (). Exec ("g ++ -g function.cpp -o function"); Процесс b = Runtime.getRuntime (). Exec ("./function");

проблема в том, что вывод, который я получаю из программы на c ++, не верен, но если я сам скомпилирую и запущу его в командной строке, он будет работать нормально. Проблема в Java, и я не знаю почему.

Большое спасибо

Al

Ответы [ 3 ]

2 голосов
/ 28 июля 2010

Есть одна определенная и одна вероятная проблема, которую я вижу здесь.Определенная проблема заключается в том, что Runtime.exec () не ожидает завершения процесса.Поэтому вам нужно будет добавить

a.waitFor();

перед вызовом b.

Возможная проблема заключается в том, что в зависимости от того, как вы вызываете это приложение, текущий рабочий каталог может оказаться не там, где вы думаетеявляется.Таким образом, function.cpp может не существовать.

1 голос
/ 28 июля 2010

Вы ожидаете завершения процесса A перед запуском процесса B?

0 голосов
/ 28 июля 2010

«Вывод ... неправильный» не помогает никому диагностировать вашу проблему.Вы должны определенно дать результат, который вы ожидали, и результат, который вы видели из Java.Предполагая, что ваша программа небольшая, вы также должны опубликовать исходный код (поскольку в конце концов речь идет о процессе компиляции).

Кстати, что происходит, когда вы переходите к рабочему направлению Java?программу, найти исполняемый файл function, который она генерирует, и вызвать ее самостоятельно из командной строки?Теперь вывод правильный?Ответ на этот вопрос позволит вам узнать, находится ли проблема на этапе компиляции или на этапе выполнения.

Если это выполнение, я рискну угадать такие вещи, как окружение (envvars, PATH и т. Д.), Нобез дополнительной информации трудно сказать.

Кроме того, как и во всех вопросах, касающихся Process es, взгляните на эти распространенные подводные камни .Похоже, что вы делаете по крайней мере один из них (обычный, не потребляющий вывод), что может привести к тому, что ваша программа будет работать над тривиальным кодом C ++, но заходит в тупик на большей базе кода.

Вы также непроверяя вывод (либо возвращаемое значение, либо потоки stdout / stderr) шага компиляции, чтобы вы не знали, была ли компиляция успешной, и если нет, какие (полезные) сообщения об ошибках вы получили от компилятора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...