Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > Запуск gcc через QProcess


Автор: andrew_121 18.5.2009, 06:40
Утро доброе!
Программа, используя QProcess запускает gcc компилятор.
Так вот, собранная в дебаг-версии работает. Но собранная в релизе нет! Процессу передаются параметры для запуска компилера. stdout и stderr записываю в файл. Так вот компилер говорит что не найдены локальные хедеры, хотя они в каталоге с маин.срр. В аргументах передаю компилеру пути для айнклудов.
В общем вопрос в том, почему в дебаг сборке работает, а в релиз нет?!

Автор: Любитель 18.5.2009, 11:40
Модератор: Название темы должно отражать ее суть!

Добавлено через 10 секунд
PS Тему перименовал

Автор: andrew_121 18.5.2009, 19:56
Гм... Все что только могло прийти в голову, перепробовал. Все то же smile 

Автор: Любитель 18.5.2009, 21:53
Как запускаешь программу? Что конкретно получаешь в stdout и stderr? Переменные окружения?

Автор: andrew_121 18.5.2009, 22:24
Любитель, Да всё с программой нормально! Добавил отладочные сообщения! С путями все правильно.
Так в дебаг сборке она работает. Может что-то с Кут? )

Автор: Любитель 18.5.2009, 23:40
Ну причём тут Qt как таковая?! Запускается ж у тебя процесс? Что выводит конкретно?

Автор: andrew_121 19.5.2009, 21:01
Цитата(Любитель @  18.5.2009,  23:40 Найти цитируемый пост)
Что выводит конкретно?

Говорит что мои хедеры не найдены. А они туточки data/*.h

Автор: SABROG 19.5.2009, 21:53
Цитата(andrew_121 @ 19.5.2009,  21:01)
А они туточки data/*.h

Туточки где именно?
  • release/data/*.h
  • debug/data/*.h

Автор: andrew_121 19.5.2009, 23:17
SABROG, Вот структура каталогов.

./programm.exe
./release
./debug
./data
./mingw

Так вот. Программа запускает g++ и передает ему аргументы. Тот должен скомпилить ./data/main.cpp, который включает в себя хедеры которые лежат там же. Но компилер сообщает что не найдены.

Автор: Любитель 19.5.2009, 23:20
Ещё раз - покажи, как конкретно (аргументы) запускаешь, и покажи энввары в это время (из программы получи лучше).

Автор: SABROG 19.5.2009, 23:36
А почему programm.exe находится не в release/debug? Ты её вручную оттуда перетаскиваешь что ли?

Автор: andrew_121 19.5.2009, 23:41
Код

struct MingwPaths {
    QString bin;
    QString lib;
    QString include;
    QString gcc;
    QString gpp;
    QString cpp;
    QString ld;
    QString ar;
    QString as;
    QString make;
};

///////////////////////////////////////////////////////////////////////////////

   process = new QProcess(this);
   process->setWorkingDirectory(curr);
   process->setStandardErrorFile("log/err.log");
   process->setStandardOutputFile("log/out.log");
   connect(    process, SIGNAL(finished(int,QProcess::ExitStatus)),
                this, SLOT(OnFinishCreating())
            );
   /**/
   QString pn = "-o" + ui->ProgrammName->text();
   QString app;
   QStringList args;
   app = QLatin1String(qPrintable(mingw.bin + "/gcc.exe"));
   args    << QLatin1String(qPrintable("-I" + curr + "/data"))
            << QLatin1String(qPrintable("-I" + temp))
            << QLatin1String("-w")
            << QLatin1String("-s")
            << QLatin1String("-Os")
            << QLatin1String("-mwindows")
            << QLatin1String(qPrintable(pn))
            << QLatin1String(qPrintable(curr + "/data/main.cpp"))
            << QLatin1String(qPrintable(mingw.lib + "/libstdc++.a"))
            << QLatin1String(qPrintable(mingw.lib + "/libcomdlg32.a"))
            << QLatin1String(qPrintable(mingw.lib + "/libshlwapi.a"))
            << QLatin1String(qPrintable(mingw.lib + "/libgdi32.a"));

   process->start(app, args);

Цитата

А почему programm.exe находится не в release/debug? Ты её вручную оттуда перетаскиваешь что ли?

Нет. Так настроил сборку.

Автор: SABROG 20.5.2009, 00:12
Цитата(andrew_121 @  19.5.2009,  23:41 Найти цитируемый пост)
QLatin1String(qPrintable(curr + "/data/main.cpp"))

Слушай, жесть какая. Разве так нельзя?

Код

args    << QLatin1String("-I") + curr + QLatin1String("/data")))
            << QLatin1String("-I") + temp)
            << QLatin1String("-w")
            << QLatin1String("-s")
            << QLatin1String("-Os")
            << QLatin1String("-mwindows")
            << pn
            << curr + QLatin1String("/data/main.cpp")
            << mingw.lib + QLatin1String("/libstdc++.a")
            << mingw.lib + QLatin1String("/libcomdlg32.a")
            << mingw.lib + QLatin1String("/libshlwapi.a")
            << mingw.lib + QLatin1String("/libgdi32.a");


А то мне кажется сплошной оверхед.

Автор: andrew_121 20.5.2009, 00:30
SABROG, передавать аргументы процессу, рекомендуется через QLatin1String(). Да и не в этом вопрос.

Автор: Любитель 20.5.2009, 02:25
Ок. А откуда берётся переменная curr у тебя?

Автор: andrew_121 20.5.2009, 02:50
Любитель
Код

QString curr = QDir::currentPath();


Автор: SABROG 20.5.2009, 08:29
Цитата(andrew_121 @  20.5.2009,  00:30 Найти цитируемый пост)
рекомендуется через QLatin1String()

Где такое написано ?

Цитата(andrew_121 @  20.5.2009,  00:30 Найти цитируемый пост)
Да и не в этом вопрос. 

А у меня все-равно идеи закончились.

Автор: Любитель 20.5.2009, 15:31
Мм.. А выложить полностью пример не можешь?

Автор: andrew_121 20.5.2009, 16:59
Цитата

Мм.. А выложить полностью пример не можешь?

зы. Давно бы выложыл, если бы мог.

Я вот что узнал.
В строках
Код

   QFile out(outname);
   Q_ASSERT( out.open(QFile::ReadWrite|QFile::Truncate) );

как раз и открываются те файлы для записи(создаются). Так вот, в дебаг сборке, они создаются, а в релиз - нет. И ассерт молчит. Мистика да и только smile 

Автор: SABROG 20.5.2009, 17:43
Цитата(andrew_121 @  20.5.2009,  16:59 Найти цитируемый пост)
Мистика да и только smile  

Да вроде нет никакой мистики:

Цитата

Prints a warning message containing the source code file name and line number if test is false


Возможно в release сборке какраз QT_NO_DEBUG определен.
Цитата

It does nothing if QT_NO_DEBUG was defined during compilation.

Автор: andrew_121 20.5.2009, 19:03
SABROG, Проверил. Нет!
Добавил строку DEFINES -= QT_NO_DEBUG, пересобрал, все тоже.

Автор: Любитель 20.5.2009, 19:32
Дефан делается на уровне features/qt.prf. Т. е. оверрайдить его не так-то просто.

Автор: andrew_121 14.6.2009, 05:21
Так я и не понял в чем проблема smile
Программа работает ТОЛЬКО в дебаг сборке.

мдя...Тема закрыта smile 

Автор: SABROG 14.6.2009, 11:58
Цитата(andrew_121 @ 14.6.2009,  05:21)
Так я и не понял в чем проблема smile
Программа работает ТОЛЬКО в дебаг сборке.

мдя...Тема закрыта smile

Замени Q_ASSERT на if() и попробуй еще раз.

Автор: andrew_121 14.6.2009, 13:39
Цитата(SABROG @  14.6.2009,  11:58 Найти цитируемый пост)
Замени Q_ASSERT на if() и попробуй еще раз. 

Пробовал! QProcess-у передаются верные пути. А он ****, компилятору их передает не верно!

п.с.
сжал все upx-ом ))) Чтоб размер не пугал. Знаю что изврат, но что еще делать? smile 

Автор: SABROG 14.6.2009, 14:25
Цитата(andrew_121 @  14.6.2009,  13:39 Найти цитируемый пост)
А он ****, компилятору их передает не верно!

Проблема с кодировкой может?

Автор: andrew_121 14.6.2009, 15:10
Пробовал по разному. Еще один вариант, написать программку которая будет выводить аргументы командной строки. Вот тогда будет смешно, или не очень.
Мне почему-то кажется что это глюк в QProcess.
Вот еще попробую с этот вариант, и отпишусь.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)