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


Автор: Mephisto 4.4.2008, 15:11
Вот собственно небольшой код. Не пойму почему не хочет компилироваться. 
Код

#include <qapplication.h>
#include <qpushbutton.h>
#include <qmainwindow.h>

class QMainWindow;

class frmMain:public QMainWindow{
Q_OBJECT
public:
  frmMain(QWidget* parent = 0, Qt::WindowFlags flags = 0):QMainWindow(parent, flags){
    pb = new QPushButton(this);
  }
  QPushButton* pb;
};

int main(int argc, char** argv){
  QApplication app(argc, argv);
  frmMain m;
  QObject::connect(m.pb, SIGNAL(clicked()), &app, SLOT(quit()));
  m.show();
  return app.exec();
}


Qmake запускал если чего smile

Автор: archimed7592 4.4.2008, 15:29

M
archimed7592
Цитата из правил раздела(даже жирным выделено для особо внимательных)
Цитата
Указывайте полностью ошибки компилятора и компоновщика.

... "если чего" smile

Автор: Mephisto 4.4.2008, 15:42
Цитата

release\main.o(.text+0xa1):main.cpp: undefined reference to `vtable for frmMain'

release\main.o(.text+0xad):main.cpp: undefined reference to `vtable for frmMain'

release\main.o(.text+0x159):main.cpp: undefined reference to `vtable for frmMain
'
release\main.o(.text+0x160):main.cpp: undefined reference to `vtable for frmMain
'
release\main.o(.text+0x219):main.cpp: undefined reference to `vtable for frmMain
'
release\main.o(.text+0x223):main.cpp: more undefined references to `vtable for f
rmMain' follow
collect2: ld returned 1 exit status


Добавлено через 26 секунд
... "если чего"  smile 

Автор: archimed7592 4.4.2008, 15:47
1. Либо засунуть определение класса в .h
2. Либо написать в конце main.cpp что-то вроде #include "main.moc"(точно не помню).
3. Либо дописать в .pro файл строку HEADERS += main.cpp

Автор: Urvin 4.4.2008, 16:32
Присоединюсь к вопросу. Причем использую Code::Blocks под win32.
Как можно все это автоматизировать?

Автор: archimed7592 4.4.2008, 16:35
Цитата(Urvin @  4.4.2008,  16:32 Найти цитируемый пост)
Как можно все это автоматизировать? 

См. п. 1 моего ответа.

Автор: Urvin 4.4.2008, 16:38
archimed7592,  прости, не секу. У меня есть ui_mainfrm.h, сформированный через uic
есть mainfrm.h:
Код

#ifndef MAINFRM_H_
#define MAINFRM_H_

#include "ui_mainfrm.h"

class frmMain : public QMainWindow, public Ui::frmMain {
    Q_OBJECT

    public:
        frmMain(QMainWindow* pwgt = 0) : QMainWindow(pwgt)
        {
            setupUi(this);
        }
};

#endif // MAINFRM_H_


и, собственно, main.cpp
Код

#include <QApplication>
#include "mainfrm.h"

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

    frmMain form;

    form.show();

    return app.exec();
}



куда жать?  smile 

Автор: Mephisto 4.4.2008, 16:52
Urvin, в твоем случае QMake запустить только нужно smile

Автор: Urvin 4.4.2008, 16:57
так ведь хочется из-под Code::Blocks все вершить, а не постоянно лазить в консольку

Автор: Mephisto 4.4.2008, 16:58
Цитата

release\moc_main.cpp:11:2: #error "The header file 'main.cpp' doesn't include <Q
Object>."
release\moc_main.cpp:18: error: `uint' does not name a type
release\moc_main.cpp:35: error: `QMetaObject' does not name a type
release\moc_main.cpp:40: error: expected init-declarator before '*' token
release\moc_main.cpp:40: error: expected `,' or `;' before '*' token
release\moc_main.cpp:45: error: `frmMain' has not been declared
release\moc_main.cpp: In function `void* qt_metacast(const char*)':
release\moc_main.cpp:48: error: `strcmp' undeclared (first use this function)
release\moc_main.cpp:48: error: (Each undeclared identifier is reported only onc
e for each function it appears in.)
release\moc_main.cpp:49: error: `frmMain' has not been declared
release\moc_main.cpp:49: error: expected `>' before '*' token
release\moc_main.cpp:49: error: expected `(' before '*' token
release\moc_main.cpp:49: error: expected primary-expression before '>' token
release\moc_main.cpp:49: error: invalid use of `this' in non-member function
release\moc_main.cpp:49: error: expected `)' before ';' token
release\moc_main.cpp:50: error: `QMainWindow' has not been declared
release\moc_main.cpp: At global scope:
release\moc_main.cpp:53: error: `frmMain' has not been declared
release\moc_main.cpp:53: error: `QMetaObject' has not been declared
release\moc_main.cpp:53: error: `Call' was not declared in this scope
release\moc_main.cpp:53: error: expected primary-expression before "int"
release\moc_main.cpp:53: error: expected primary-expression before "void"
release\moc_main.cpp:54: error: initializer expression list treated as compound
expression
release\moc_main.cpp:54: error: expected `,' or `;' before '{' token
mingw32-make.exe[1]: *** [release\moc_main.o] Error 1
mingw32-make.exe[1]: Leaving directory `C:/tratata'
c:\MinGW\bin\mingw32-make.exe: *** [release] Error 2

Цитата(archimed7592 @  4.4.2008,  16:47 Найти цитируемый пост)
1. Либо засунуть определение класса в .h
2. Либо написать в конце main.cpp что-то вроде #include "main.moc"(точно не помню).
3. Либо дописать в .pro файл строку HEADERS += main.cpp 


archimed7592, Это мне написало после выполнения п.3
Файл moc_main.cpp появляется именно после п.3. До этого есть только main.o

Автор: JackYF 4.4.2008, 16:59
Цитата(Urvin @  4.4.2008,  15:57 Найти цитируемый пост)
Code::Blocks все вершить, а не постоянно лазить в консольку 

там есть замечательная опция "use external makefile"

Автор: archimed7592 4.4.2008, 17:06
Цитата(Mephisto @  4.4.2008,  16:58 Найти цитируемый пост)
archimed7592, Это мне написало после выполнения п.3

Значит п.3 отпадает,
в п.2 корректива: #include "moc_main.cpp",
а в п.1 уточнение:
    либо нужно сделать qmake -project, чтобы перегенерился .pro(учти, что всё что ты написал там руками затрётся),
    либо добавить соответствующий .h в HEADERS ручками.

Автор: Mephisto 6.4.2008, 11:08
Код

#include <qapplication.h>
#include <qmainwindow.h>
#include <qpushbutton.h>

class frmMain:public QMainWindow{
    Q_OBJECT
public:
    frmMain():QMainWindow(0, 0){
        pb = new QPushButton(this);
    }
    QPushButton* pb;
};

int main( int argc, char ** argv ) {
    QApplication a( argc, argv );
    frmMain * mw = new frmMain();
        QObject::connect(mw->pb, SIGNAL(clicked()), &a, SLOT(quit()));
    mw->show();
    return a.exec();
}

#include <main.moc>

Вот так скомпилилось. По крайней мере под линухом smile

Автор: vitovt 21.3.2010, 16:45
Маленькое дополнение к топику
Недавно встретился с такой же проблемой.
Стал разрабатывать небольшую аппликуху, состоящую из нескольких модулей. Естессно, решил вынести общие заголовочные файлы в отдельную директорию. Структура проекта имела вид:

Код

<AppRoot>
    <include>
          mainwindow.h
    <mainapp>
          main.cpp
          mainwindow.cpp
    <somelib>


Файл проекта mainapp.pro выглядел:

Код

TARGET = mainapp
TEMPLATE = app
SOURCES += main.cpp \
    mainwindow.cpp 
INCLUDEPATH += ../include
HEADERS += mainwindow.h 


При попытке построить проект получал undefined reference to `vtable for MainWindow'
Как выяснилось, дело оказалось в файле проекта. mainwindow.h следовало включать так:

Код

HEADERS += ../include/mainwindow.h 


т.е. с полным путем

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