edwardoid
31.7.2008, 12:44
main.cpp#include <QApplication>
#include <QFont>
#include <QPushButton>
#include "test.h"
int main(int argc, char* argv[])
{
QApplication app(argc, argv);
Test t;
t.show();
return app.exec();
}
test.h#ifndef TEST_H
#define TEST_H
#include <QMainWindow.h>
class Test : public QMainWindow
{
Q_OBJECT
public:
Test(QWidget* = NULL);
virtual ~Test();
protected:
private:
};
#endif // TEST_H
test.cpp#include "test.h"
Test::Test(QWidget* parent): QMainWindow(parent)
{
//ctor
}
Test::~Test()
{
//dtor
}
результат компиляции:
-------------- Build: Debug in QTesting ---------------
Linking console executable: bin\Debug\QTesting.exe
obj\Debug\test.o: In function `_ZN4TestC2EP7QWidget':
C:/Users/Edward/Programming/QTesting/test.cpp:4: undefined reference to `vtable for Test'
C:/Users/Edward/Programming/QTesting/test.cpp:4: undefined reference to `vtable for Test'
obj\Debug\test.o: In function `_ZN4TestC1EP7QWidget':
C:/Users/Edward/Programming/QTesting/test.cpp:4: undefined reference to `vtable for Test'
C:/Users/Edward/Programming/QTesting/test.cpp:4: undefined reference to `vtable for Test'
obj\Debug\test.o: In function `_ZN4TestD2Ev':
C:/Users/Edward/Programming/QTesting/test.cpp:9: undefined reference to `vtable for Test'
obj\Debug\test.o:C:/Users/Edward/Programming/QTesting/test.cpp:9: more undefined references to `vtable for Test' follow
collect2: ld returned 1 exit status
Process terminated with status 1 (0 minutes, 0 seconds)
6 errors, 0 warnings
Я не пойму почему так? Если убрать Q_OBJECT все скомпилируется, но без этого макроса я не смогу создаватх свои слоты!
Помогите.
Litkevich Yuriy
31.7.2008, 15:51
1) штатные примеры на висте компилятся?
2) не пиши так: #include <QMainWindow.h> пиши имя модуля, а не файла ( #include <QMainWindow>)
3) не NULL, а 0!
4) в pro-файле test.h указан?
edwardoid
31.7.2008, 16:10
1)Все компилит, если нет этого Q_OBJECT.
2) Сорри, не пойму какого хрена написал этот .х
3) Какая разница? Вроде ссылке можно придать значение НУЛЛ
4) наверное, я делал qmake -project и qmake, потом make...
Litkevich Yuriy
31.7.2008, 16:15
Цитата(edwardoid @ 31.7.2008, 20:10)
3) Какая разница? Вроде ссылке можно придать значение НУЛЛ
сильно не рекомендуют, см. Qt'явые исходники, всюду нуль
Цитата(edwardoid @ 31.7.2008, 20:10)
4) наверное, я делал qmake -project и qmake, потом make...
провери и выложи pro-файл
edwardoid, ты можешь сначала сгенерировать автоматически файл проекта, а затем добавить туда свои файлы, если qmake их не добавил
edwardoid
31.7.2008, 18:26
QTesting.proCODE
###############################################################
#######
# Automatically generated by qmake (2.01a) ??? 1. ??? 20:12:45 2008
######################################################################
TEMPLATE = app
TARGET =
DEPENDPATH += .
INCLUDEPATH += .
# Input
HEADERS += test.h
SOURCES += main.cpp test.cpp
Цитата(void* @ 31.7.2008, 19:14)
edwardoid, ты можешь сначала сгенерировать автоматически файл проекта, а затем добавить туда свои файлы, если qmake их не добавил
Как это делается в Code::Blocks?
Sergey B.
31.7.2008, 18:58
Если нет своих слотов, то Q_OBJECT писать не надо.
Когда напишете слоты (объявите), добавите и этот макрос
По этому макросу moc строит таблицу вирьтуальных ф-й, а так как нет слотов она пустая.
Litkevich Yuriy
31.7.2008, 19:49
Цитата(edwardoid @ 31.7.2008, 20:10)
1)Все компилит, если нет этого Q_OBJECT.
я спрашивал про стандартные примеры (Qt'явые) дело в том, что под висту нужен патченый MinGW32.
---
Уменя твой код копилится без проблем, проверено на Windows 2kSP4, Qt-4.4.0, gcc (GCC) 3.4.5 (mingw special)
edwardoid
31.7.2008, 22:05
Цитата(Litkevich Yuriy @ 31.7.2008, 21:49)
Цитата(edwardoid @ 31.7.2008, 20:10)
1)Все компилит, если нет этого Q_OBJECT.
я спрашивал про стандартные примеры (Qt'явые) дело в том, что под висту нужен патченый MinGW32.
---
Уменя твой код копилится без проблем, проверено на Windows 2kSP4, Qt-4.4.0, gcc (GCC) 3.4.5 (mingw special)
Как пропатчить?
Litkevich Yuriy
31.7.2008, 23:35
1) как ставил Qt на висту? (программу установки использовал или собирал из исходников)
2) как MinGW ставил? (откуда и что брал)
1) QT через инсталяционник. Вместо скачки MinGW указал эту директорию у Code::Blocks
2) Code::Blocks сам поставил.
===
Есть версия MinGW которая будет строить как 64битные версии, так и 32-ух битные. И вообще, имееет ли смысл компилировать разные версии для разных разрядностей процессора, если не,т то почему?
Litkevich Yuriy
1.8.2008, 5:06
Цитата(edwardoid @ 1.8.2008, 5:06)
Есть версия MinGW которая будет строить как 64битные версии, так и 32-ух битные.
Эту похоже патчить не надо, но на всякий случай смотри тут
GCC Version 3 в старых сборках есть файлы помеченые как *-vista их переименовываешь, удаляя приписку виста, и вместо основных кладешь.
версию GCC можно посмотреть так:
gcc --version
Цитата(edwardoid @ 1.8.2008, 5:06)
если не,т то почему?
а зачем тебе лишняя работа, собирай 32-х битную и все.
Теперь еще скажи, ты отладочные библиотеки Qt собрал?
но тем не менее проблема не решена. вроде гцц гормалный. qt не собирал, инсталляционник был...
А это что за фигня?
Цитата(edwardoid @ 31.7.2008, 13:44)
Test(QWidget* = NULL);
может лучше
Test(QWidget* parent = NULL);
Litkevich Yuriy
1.8.2008, 21:00
trdm,
а у меня его пример без исправлений компилится
edwardoid
1.8.2008, 21:06
Цитата(trdm @ 1.8.2008, 22:55)
А это что за фигня?
Цитата(edwardoid @ 31.7.2008, 13:44)
Test(QWidget* = NULL);
может лучше
Test(QWidget* parent = NULL);
Если ты о test.h, то навания переменных я не обязан указывать в прототипе функции. Это стандарт. Главное указать тип. Что я и сделал. Так, что это непричем.
Litkevich Yuriy
1.8.2008, 21:10
edwardoid, ты лучше ответь на мой вопрос, отладочные библиотеки собирал или еще нет?
Цитата(trdm @ 1.8.2008, 20:55)
может лучше
Test(QWidget* parent = NULL);
нет, в объявлениях не обязательно указывать имена переменных, достаточно только указания типа, хотя конечно действительно лучше использовать простой ноль (0) вместо NULL
упс, опоздал
Цитата(edwardoid @ 1.8.2008, 22:06)
Если ты о test.h, то навания переменных я не обязан указывать в прототипе функции. Это стандарт. Главное указать тип. Что я и сделал. Так, что это непричем.
стандарт, это понятно.
Я просто намекал на препроцессорную подготовку. может там это важно...
edwardoid
3.8.2008, 22:44
ne pomoglo...
Цитата(edwardoid @ 1.8.2008, 9:04)
qt не собирал, инсталляционник был...
А ты уверен, что в инсталяшке именно сборка для Vista?
Может проще всетаки самому руками собрать?
edwardoid
4.8.2008, 10:49
Цитата(ViGOur @ 4.8.2008, 12:37)
Цитата(edwardoid @ 1.8.2008, 9:04)
qt не собирал, инсталляционник был...
А ты уверен, что в инсталяшке именно сборка для Vista?
Может проще всетаки самому руками собрать?
Что Вистовская весия? комилятор или библиотека?
Litkevich Yuriy
4.8.2008, 11:40
edwardoid, попробуй отладочную версию собрать:
"Пуск" -> "Программы" -> "Qt 4.4.*****" -> "Qt 4.4.* (Build Debug Libraries)"
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.