Невозможно запустить g++ с помощью QProcess

Я хочу скомпилировать файл С++ из приложения Qt с помощью QProcess. Но это не работает, я не вижу никаких файлов .o или .exe, сгенерированных компилятором.

Вот что я делаю -

QProcess *process = new QProcess(this);
QString program = "g++";
QStringList arguments;
//fileName is fetched from QFileDialog
arguments << fileName << "-o" << QFileInfo(fileName).path() + QFileInfo(fileName).baseName() + ".exe";

errorFilename = QFileInfo(fileName).baseName() + "_error.txt";

process->setStandardOutputFile(errorFilename);

connect(process, SIGNAL(finished(int)), this, SLOT(compiled()));
process->start(program, arguments);

Пожалуйста, скажите мне, что не так с этим кодом. Я работаю на виндовс 7.


person Shubham    schedule 12.02.2014    source источник
comment
Что именно происходит? Вы получаете сообщение об ошибке, если да, то что и когда (при компиляции или запуске кода)?   -  person Mats Petersson    schedule 12.02.2014
comment
у вас есть пробелы в вашем пути к файлу?   -  person louissmr    schedule 12.02.2014
comment
@MatsPetersson Сгенерированный errorFile пуст. Я не вижу никаких ошибок.   -  person Shubham    schedule 12.02.2014
comment
@louissmr fileName устанавливается QFileDialog::getOpenFileName().   -  person Shubham    schedule 12.02.2014
comment
хорошо, но на вашем пути есть пробелы? У меня были проблемы с QProcess и путями с пробелами в качестве аргументов в Windows. Процесс запускается нормально, но аргументы не в порядке.   -  person louissmr    schedule 12.02.2014
comment
@louissmr О, да, в нем есть пробелы.   -  person Shubham    schedule 12.02.2014
comment
процесс-›start(QString(g++ -o \%1\ \%2\ ).arg(fileName.path).arg(fileName+exe);   -  person louissmr    schedule 12.02.2014
comment
QProcess следует заключать в кавычки любые аргументы, содержащие пробелы (qt-project .org/doc/qt-5.0/qtcore/qprocess.html#start).   -  person Michael Burr    schedule 12.02.2014
comment
Есть ли g++ в PATH (в среде программы Qt)? Что происходит, когда вы пытаетесь скомпилировать тот же файл с теми же аргументами из командной строки?   -  person Michael Burr    schedule 12.02.2014
comment
@louissmr Спасибо, теперь работает нормально :)   -  person Shubham    schedule 12.02.2014
comment
@MichaelBurr Да, это в PATH   -  person Shubham    schedule 12.02.2014
comment
@louissmr: на самом деле, перегрузка start(), использующая QStringList(), обычно более надежна и предпочтительнее, чем ручное цитирование.   -  person Frank Osterfeld    schedule 12.02.2014
comment
@FrankOsterfeld да, и я использую этот метод в Linux и MacOSX, но, по крайней мере, в некоторых версиях Qt (сейчас я не могу вспомнить точный номер версии) он не работает должным образом в Windows.   -  person louissmr    schedule 12.02.2014


Ответы (1)


Имейте в виду, что ошибки не относятся к stdout, они относятся к stderr. Попробуйте использовать:

process->setStandardErrorFile(errorFilename);

Также QFileInfo::path() не будет иметь разделителя пути в конце, поэтому вам нужно будет добавить его при объединении пути с базовым именем файла:

QFileInfo finfo(fileName);

arguments << fileName << "-o" << QFileInfo( QDir(finfo.path()), finfo.baseName() + ".exe").filePath();
person Michael Burr    schedule 12.02.2014