Структура приложения такая:
имеется основной поток, который является веб-сервером и обрабатывает заявки от пользователей на компиляцию, сохраняя в БД.
Имеется CompilerThread, наследуемый от QThread, запускаемый при старте веб-сервера (соединяется с БД другим соединением, здесь нет проблем).
Затем QThread в цикле с задержкой извлекает нужные задачи и выполняет их на компиляцию, вызывая shell-скрипт.
Если этот скрипт запускается из основного потока, то все нормально ,программа компилируется.
Из вторичного потока g++ выдает ошибку "undefined reference to `main\'"
файл build_cpp.sh:
#!/bin/sh
path='/home/mapron/qt/server';
g++ $path/tmp/in.cpp -Wfatal-errors -o $path/tmp/out.run 2>&1
фрагмен run(), цикл опущен:
C++ (Qt)
if (!subm.empty()){
QFile file("tmp/in.cpp");
int status=1;
QString message="Internal error";
if (file.open(QIODevice::WriteOnly | QIODevice::Truncate)){
if (QFile::exists(appdir+"/tmp/out.run")){
QFile::remove(appdir+"/tmp/out.run");
}
file.write(subm["txt"].toByteArray());
file.close(); // ВОТ ЭТА СТРОЧКА ВСЕ РЕШИЛА
QProcess compiler;
compiler.start("bash",
QStringList() << appdir+"/tmp/build_cpp.sh",
QIODevice::ReadOnly);
if (compiler.waitForStarted()){
if (compiler.waitForFinished()){
QByteArray result = compiler.readAll();
if (result.trimmed()=="" && QFile::exists(appdir+"/tmp/out.run")){
status=10;
message="";
}else{
status=2;
message=result.replace(appdir+"/tmp/","");
if (message.indexOf("undefined reference to `main\'")!= -1){
message="undefined reference to `main`";
}
}
}
}
}
submiss.update(Var("status",status,"message",message),Var("id=?",subm["id"]));
}
если сделать вывод не bash, а env - то там с путями все в порядке. Если убрать файл физически, то в выводе g++ ругается на отстутсвующий файл. Если в файл написать любой мусор, что угодно - вылазит это сообщение.
UPD: нужно доавить file.close(); после окончания записи
А еще программист с 7 лет опыта называется