Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Общие вопросы _ Qt+CodeBlocks

Автор: Fedcomp 23.10.2010, 20:51

Всем привет.
Хочу чтобы CodeBlocks на автомате (по клавише F9 т.е компиляция) проходился по полному циклу qmake и потом компиляция через mingw.
Но возникло много трудностей. Во первых я новичок, процессы компиляции понимаю крайне плохо (лишь знаю что в .o файлах компилируется код, затем линкером объединяется в экзешник, ну ещё что то слышал про makefile, но не знаю как они работают, и знаю что Qt использует moc для того чтобы добавить к C++ упрощенный вид функций (т.е препроцессор moc делает б0льшую работу за программиста, собственно превращая псевдо slots и signals в настоящий код понятный компилятору))
Во вторых не понятен способ ручной компиляции Qt проектов. В Qt designer сборка проходит абсолютно прозрачно, как и что он в это время делает не понятно.
Пробовал порыться в гугле, нашел qmake -project (рекурсивно проходится по текущему каталогу и составляет qt проект) и qmake "имя_проекта.pro" который проходится moc'ом как я понял.
Так вот такая задача, хочу чтобы CodeBlocks автоматически запускал qmake перед компиляцией, это возможно?

Автор: Kagami 23.10.2010, 21:07

Когда я пару лет назад работал в Code::Blocks, то для работы с Qt я использовал плагин http://code.google.com/p/qtworkbench/. Впрочем он был не совсем удобен, и насколько я могу судить он не очень активно развивается. После выхода первой версии Qt Сreator я перешел на него и не жалею. Рекомендую на него посмотреть ;)

Автор: Litkevich Yuriy 23.10.2010, 22:05

Цитата(Fedcomp @ 23.10.2010, 23:51) *
В Qt designer сборка проходит абсолютно прозрачно, как и что он в это время делает не понятно.
В дизайнере сборка вообще не происходит. Это всего лишь инструмент для визуального создания виджетов/окон

Цитата(Fedcomp @ 23.10.2010, 23:51) *
Во вторых не понятен способ ручной компиляции Qt проектов.

1) qmake myproject.pro
2) make
...
N) make

1 - программа qmake создаёт make-файлы на основе pro-файла
2 - программа make читает make-файлы и исполняет инструкции записанные в них, в отличие от bat/shell-файлов логика обработки make-файлов специфичная, т.к. позволяет отслеживать зависимости команд (например, нужно ли перекомпилировать такой-то файл или он не изменялся со времени последней компиляции)
N - тоже что и №2, так как в make-файле есть цель в виде pro-файла. Т.е. если pro-файл изменился, программа make это заметит и вызовит qmake автоматически.

П.С.
1) иногда всё таки приходится повторно вызывать qmake явно (руками), это когда, например, класс наследник QObject сначала не содержал макрос Q_OBJECT, а потом этот макрос появился.
2) moc вручную не вызывают, программа qmake записывает соответствующий вызов в make-файл

Автор: Fedcomp 24.10.2010, 11:38

Т.е достаточно сделать Makefile с помощью QT и заставить кодеблоки юзать этот мейкфайл?
и при этом qmake при необходимости будет запускаться сам, я правильно все понял?

Делаю так,
cmd.exe=>

D:\non_users\projecT\GSC\develope\server_configurator>qmake -project

D:\non_users\projecT\GSC\develope\server_configurator>qmake "server_configurator
.pro"
WARNING: d:\non_users\projecT\GSC\develope\server_configurator\server_configurat
or.pro:7: Unescaped backslashes are deprecated.
WARNING: d:\non_users\projecT\GSC\develope\server_configurator\server_configurat
or.pro:7: Unescaped backslashes are deprecated.
WARNING: d:\non_users\projecT\GSC\develope\server_configurator\server_configurat
or.pro:7: Unescaped backslashes are deprecated.

D:\non_users\projecT\GSC\develope\server_configurator>

Появляются мейк файлы (Makefile, Makefile.release, Makefile.debug)

Дальше захожу в CodeBlocks, запускаю проект и в свойствах проекта нажимаю "This is custom makefile" нажимаю ок.
Жму F9 (т.е компиляцию и запуск)
Получаю
It seems that this project has no been built yet.
Do you want to build it now?

(что нормально, т.е кодеблок хочет его компильнуть)
Нажимаю yes и получаю
-------------- Build: Debug in srvconfig ---------------

Using makefile: Makefile
MAKE Version 5.2  Copyright (c) 1987, 1998 Inprise Corp.
Fatal: 'FORCE' does not exist - don't know how to make it
Process terminated with status 1 (0 minutes, 0 seconds)
0 errors, 0 warnings

Смотрю в makefile и вижу
debug: $(MAKEFILE).Debug FORCE
    $(MAKE) -f $(MAKEFILE).Debug
debug-make_default: $(MAKEFILE).Debug FORCE
    $(MAKE) -f $(MAKEFILE).Debug
debug-make_first: $(MAKEFILE).Debug FORCE
    $(MAKE) -f $(MAKEFILE).Debug first
debug-all: $(MAKEFILE).Debug FORCE
    $(MAKE) -f $(MAKEFILE).Debug all

И много подобных строк. Как я понял компилятор не знает что делать с FORCE
Что я сделал не так?

Автор: Litkevich Yuriy 24.10.2010, 12:03

Цитата(Fedcomp @ 24.10.2010, 14:38) *
Т.е достаточно сделать Makefile с помощью QT и заставить кодеблоки юзать этот мейкфайл?
и при этом qmake при необходимости будет запускаться сам, я правильно все понял?
да.

Цитата(Fedcomp @ 24.10.2010, 14:38) *
Как я понял компилятор не знает что делать с FORCE
не компилятор а программа make

Я не знаю, что делает CodeBlocks, нужно просто скомандовать
make - будет собирать и релиз и отладку, но может перетереть предыдущий вариант (например релизный), т.к. зависит от настроек проекта
или
make debug - для сборки отладочной версии приложения
или
make release - для сборки релизной версии приложения

Автор: Fedcomp 24.10.2010, 13:16

Дело сдвинулось, нашел ваш пост по этому поводу http://www.forum.crossplatform.ru/index.php?showtopic=1296&view=findpost&p=8828
Действительно у меня стоял борландовский C++, убрал его из переменных сред подключился mingw (на самом деле не подключился, я скопировал mingw32-make.exe в файл с названием make.exe, теперь из командной строки запускается как и положено mingw)
Поидее теперь qmake должен работать нормально. Значит проблема не в этом.
Дело в том что я пытаюсь пробный проект скомпилить, сделал форму в Qt creator'е, и пытаюсь её подсоединить к проекту.
Есть
main.cpp

#include <QApplication>
#include <QDialog>

using namespace std;

#include "forms/mainform/mainfrm.h"

int main(int argc, char* argv[])
{
    QApplication app(argc, argv);

    Ui::mainfrm ui;
    QDialog *dialog = new QDialog;
    ui.setupUi(dialog);

    dialog->show();

    return app.exec();
}

Есть
forms/mainform/mainfrm.h
#ifndef MAINFRM_H
#define MAINFRM_H

#include <QMainWindow>

namespace Ui {
    class mainfrm;
}

class mainfrm : public QMainWindow
{
    Q_OBJECT

public:
    explicit mainfrm(QWidget *parent = 0);
    ~mainfrm();

private:
    Ui::mainfrm *ui;
};

#endif // MAINFRM_H

Есть
forms/mainform/mainfrm.cpp
#include "mainfrm.h"
#include "ui_mainfrm.h"

mainfrm::mainfrm(QWidget *parent) : QMainWindow(parent),ui(new Ui::mainfrm)
{
    ui->setupUi(this);
}

mainfrm::~mainfrm()
{
    delete ui;
}


При компиляции получаю ошибку
main.cpp|12|error: aggregate 'Ui::mainfrm ui' has incomplete type and cannot be defined|

Кстати говоря #include "ui_mainfrm.h" не создается почему то ...

Автор: Litkevich Yuriy 24.10.2010, 13:39

Прочитай http://doc.crossplatform.ru/qt/4.6.x/designer-using-a-ui-file.html, проверь pro-файл

Автор: Fedcomp 24.10.2010, 14:00

Можно пример самого простого приложения на Qt? и хотелось бы узнать как компилировать вручную этот проект.

Автор: alex977 24.10.2010, 14:33

Простейший пример.

hello.cpp:

#include <QtGui>
int main(int argc, char** argv)
{
    QApplication app(argc, argv);
    QLabel lbl("Hello, World !");
    lbl.show();
    return app.exec();
}


hello.pro:

TEMPLATE = app
SOURCES     = hello.cpp
win32:TARGET     = ../Hello



Автор: Fedcomp 24.10.2010, 17:06

В консоли скомпилился ...

можно ли какой либо простой пример, чтобы проверить отрабатывается ли qmake при компиле?

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)