Запуск компилятора MSVC из кода Java выдает ошибку - PullRequest
0 голосов
/ 18 декабря 2011

Я пытаюсь скомпилировать некоторый исходный файл C ++ с помощью MSVC2008 компилятора из кода Java.Например, у меня есть путь к исходному файлу и путь к компилятору MS.Мне нужно запустить компилятор и получить путь к исполняемому файлу или состояние ошибки.Но все, что я до сих пор получаю, это «Не определены пути включения» ошибка и состояние выхода 2.

Гугление немного дало мне путь к файлу vsvars32.bat, который исправил эту ошибкупри работе с сырой cmd.Но похоже, что у Java есть своя собственная среда, совершенно отличная от ОС, когда запускается процесс с ProcessBuilder.

Пока у меня есть этот код:

compilerPath = String.format("\"C:\\Program Files (x86)\\Microsoft Visual Studio 9.0\\VC\\bin\\cl.exe\" \"%s\"", sourcePath);

ProcessBuilder builder = new ProcessBuilder(compilerPath);
Process process = builder.start();
builder.redirectErrorStream(true);
process.waitFor();

Thisвозвращает exitValue == 2 и указанную выше ошибку каждый раз, когда я запускаю ее.

Как это можно исправить, чтобы я мог просто запустить cl.exe и получить свой исполняемый файл?

Ответы [ 2 ]

1 голос
/ 18 декабря 2011

Вы можете просто запустить cl.exe, если он находится только в вашей переменной PATH. Это не вопрос Java. Это конфигурация вашей ОС.

Проблема в том, что, вероятно, вы не можете настроить среду каждого компьютера, на котором вы запускаете приложение. Другая возможная проблема состоит в том, что, вероятно, компилятор должен выполняться в определенной директории (например, в директории проекта).

Очевидно, что пробелы в пути добавляют еще один уровень сложности.

Сначала попробуйте сделать то же самое из командной строки. Есть вероятность, что он тоже потерпит неудачу и напишет причину.

Если это работает, вернитесь к своему Java-коду, но попробуйте прочитать STOUT и STDERR из cl.exe. Я считаю, что это печатает что-то, что может помочь вам понять, в чем проблема.

0 голосов
/ 19 декабря 2011

Хитрость заключалась в том, чтобы установить INCLUDE и LIB переменные окружения для ProcessBuilder и его Process 'es:

ProcessBuilder builder = new ProcessBuilder("cl.exe main.cpp /nologo".split("\\s+"));
builder.redirectErrorStream(true);
builder.environment().put("INCLUDE", "C:\\Program Files (x86)\\Microsoft Visual Studio 9.0\\VC\\include;C:\\Program Files (x86)\\Microsoft SDKs\\Windows\\v7.0A\\Include");
builder.environment().put("LIB", "C:\\Program Files (x86)\\Microsoft Visual Studio 9.0\\VC\\lib;C:\\Program Files (x86)\\Microsoft SDKs\\Windows\\v7.0A\\Lib");

Process process = builder.start();

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