LinuxForum.Fans
Тема

[Решено] Qt3: ошибка undefined reference to 'main'

Автор: clp 15 сообщений 6747 просмотров 🔒 закрыта
#36807

Доброго времени суток. Недавно начал изучать Qt, захотелось написать калькулятор. Но при компиляции выскакивает неизвестная мне ошибка:


g++ -c -pipe -fmessage-length=0 -O2 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables -g -DUSE_LIB64_PATHES -fno-strict-aliasing -Wall -W -fmessage-length=0 -O2 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables -g -DUSE_LIB64_PATHES -fno-strict-aliasing -DQT_NO_DEBUG -DQT_SHARED -DQT_TABLET_SUPPORT -DQT_THREAD_SUPPORT -I/usr/lib/qt3/mkspecs/default -I. -I. -I/usr/include -I/usr/lib/qt3/include -o calc1.o calc1.cpp
In file included from calc1.cpp:17:
calc1.ui.h: In member function ‘virtual void Form1::n_b_click()’:
calc1.ui.h:78: warning: suggest parentheses around assignment used as truth value
g++ -o bin calc1.o moc_calc1.o -L/usr/lib64/ -L/usr/lib/qt3/lib64/ -L/usr/X11R6/lib64/ -lqt-mt -lXext -lX11 -lm
/usr/lib64/gcc/x86_64-suse-linux/4.3/../../../../lib64/crt1.o: In function `_start':
/usr/src/packages/BUILD/glibc-2.9/csu/../sysdeps/x86_64/elf/start.S:109: undefined reference to `main'
collect2: ld returned 1 exit status
make: *** [bin] Ошибка 1

Прикрепляю файл ui.h, за кривость кода прошу не ругать, ибо только начинаю и, пока что, гораздо важнее, чтоб работало. =) Спасибо за внимание.
З.Ы. В гугле был, сорри, если тема уже тут поднималась.

#36987

Кхм..., для начала изучи как правильно писать на C++ простые консольные программки с применением ООП.

#36988

clp,
Функция main в calc1.cpp имеет место быть или как?

#36991
Hvzh написал:
Функция main в calc1.cpp имеет место быть или как?

Нет. Вот файл calc1.cpp


#include "calc1.h"

#include <qvariant.h>
#include <qpushbutton.h>
#include <qlineedit.h>
#include <qlayout.h>
#include <qtooltip.h>
#include <qwhatsthis.h>
#include "calc1.ui.h"

/*
* Constructs a Form1 as a child of 'parent', with the
* name 'name' and widget flags set to 'f'.
*
* The dialog will by default be modeless, unless you set 'modal' to
* TRUE to construct a modal dialog.
*/
Form1::Form1( QWidget* parent, const char* name, bool modal, WFlags fl )
: QDialog( parent, name, modal, fl )
{
if ( !name )
setName( "Form1" );

b_3 = new QPushButton( this, "b_3" );
b_3->setGeometry( QRect( 140, 310, 50, 40 ) );

b_1 = new QPushButton( this, "b_1" );
b_1->setGeometry( QRect( 20, 310, 50, 40 ) );

b_4 = new QPushButton( this, "b_4" );
b_4->setGeometry( QRect( 20, 260, 50, 40 ) );

b_7 = new QPushButton( this, "b_7" );
b_7->setGeometry( QRect( 20, 210, 50, 40 ) );

b_5 = new QPushButton( this, "b_5" );
b_5->setGeometry( QRect( 80, 260, 50, 40 ) );

b_6 = new QPushButton( this, "b_6" );
b_6->setGeometry( QRect( 140, 260, 50, 40 ) );

b_2 = new QPushButton( this, "b_2" );
b_2->setGeometry( QRect( 80, 310, 50, 40 ) );

b_8 = new QPushButton( this, "b_8" );
b_8->setGeometry( QRect( 80, 210, 50, 40 ) );

b_9 = new QPushButton( this, "b_9" );
b_9->setGeometry( QRect( 140, 210, 50, 40 ) );

b_ravn = new QPushButton( this, "b_ravn" );
b_ravn->setGeometry( QRect( 170, 360, 80, 40 ) );

b_t = new QPushButton( this, "b_t" );
b_t->setGeometry( QRect( 110, 360, 50, 40 ) );

b_umn = new QPushButton( this, "b_umn" );
b_umn->setGeometry( QRect( 260, 310, 50, 40 ) );

b_del = new QPushButton( this, "b_del" );
b_del->setGeometry( QRect( 260, 360, 50, 40 ) );

b_sum = new QPushButton( this, "b_sum" );
b_sum->setGeometry( QRect( 200, 260, 50, 90 ) );

b_step = new QPushButton( this, "b_step" );
b_step->setGeometry( QRect( 260, 260, 50, 40 ) );

b_0 = new QPushButton( this, "b_0" );
b_0->setGeometry( QRect( 20, 360, 80, 40 ) );

lineEdit1 = new QLineEdit( this, "lineEdit1" );
lineEdit1->setGeometry( QRect( 20, 180, 290, 25 ) );

b_root = new QPushButton( this, "b_root" );
b_root->setGeometry( QRect( 260, 210, 50, 40 ) );

b_razn = new QPushButton( this, "b_razn" );
b_razn->setGeometry( QRect( 200, 210, 50, 40 ) );
languageChange();
resize( QSize(600, 480).expandedTo(minimumSizeHint()) );
clearWState( WState_Polished );

// signals and slots connections
connect( b_0, SIGNAL( clicked() ), this, SLOT( n_b_click() ) );
connect( b_1, SIGNAL( clicked() ), this, SLOT( n_b_click() ) );
connect( b_2, SIGNAL( clicked() ), this, SLOT( n_b_click() ) );
connect( b_3, SIGNAL( clicked() ), this, SLOT( n_b_click() ) );
connect( b_4, SIGNAL( clicked() ), this, SLOT( n_b_click() ) );
connect( b_5, SIGNAL( clicked() ), this, SLOT( n_b_click() ) );
connect( b_6, SIGNAL( clicked() ), this, SLOT( n_b_click() ) );
connect( b_7, SIGNAL( clicked() ), this, SLOT( n_b_click() ) );
connect( b_8, SIGNAL( clicked() ), this, SLOT( n_b_click() ) );
connect( b_9, SIGNAL( clicked() ), this, SLOT( n_b_click() ) );
connect( b_t, SIGNAL( clicked() ), this, SLOT( n_b_click() ) );
connect( b_ravn, SIGNAL( clicked() ), this, SLOT( r_b_click() ) );
connect( b_umn, SIGNAL( clicked() ), this, SLOT( op_b_click() ) );
connect( b_razn, SIGNAL( clicked() ), this, SLOT( op_b_click() ) );
connect( b_del, SIGNAL( clicked() ), this, SLOT( op_b_click() ) );
connect( b_sum, SIGNAL( clicked() ), this, SLOT( op_b_click() ) );
connect( b_root, SIGNAL( clicked() ), this, SLOT( sqrt_b_click() ) );
connect( b_step, SIGNAL( clicked() ), this, SLOT( op_b_click() ) );

// tab order
setTabOrder( b_ravn, lineEdit1 );
setTabOrder( lineEdit1, b_1 );
setTabOrder( b_1, b_2 );
setTabOrder( b_2, b_3 );
setTabOrder( b_3, b_4 );
setTabOrder( b_4, b_5 );
setTabOrder( b_5, b_6 );
setTabOrder( b_6, b_7 );
setTabOrder( b_7, b_8 );
setTabOrder( b_8, b_9 );
setTabOrder( b_9, b_0 );
setTabOrder( b_0, b_t );
setTabOrder( b_t, b_razn );
setTabOrder( b_razn, b_sum );
setTabOrder( b_sum, b_root );
setTabOrder( b_root, b_step );
setTabOrder( b_step, b_umn );
setTabOrder( b_umn, b_del );
}

/*
* Destroys the object and frees any allocated resources
*/
Form1::~Form1()
{
// no need to delete child widgets, Qt does it all for us
}

/*
* Sets the strings of the subwidgets using the current
* language.
*/
void Form1::languageChange()
{
setCaption( tr( "Form1" ) );
b_3->setText( tr( "3" ) );
b_1->setText( tr( "1" ) );
b_4->setText( tr( "4" ) );
b_7->setText( tr( "7" ) );
b_5->setText( tr( "5" ) );
b_6->setText( tr( "6" ) );
b_2->setText( tr( "2" ) );
b_8->setText( tr( "8" ) );
b_9->setText( tr( "9" ) );
b_ravn->setText( tr( "=" ) );
b_t->setText( tr( "." ) );
b_umn->setText( tr( "*" ) );
b_del->setText( tr( "/" ) );
b_sum->setText( tr( "+" ) );
b_step->setText( tr( "x^y" ) );
b_0->setText( tr( "0" ) );
b_root->setText( tr( "sqrt" ) );
b_razn->setText( tr( "-" ) );
}

#36995

Тогда Вам действительно нужно начать с азов. Вот

text
#include <QApplication>
#include <QLabel>

int main(int argc, char *argv[]) { QApplication app(argc, argv); QLabel *label = new QLabel("Hello Qt!"); label->show(); return app.exec(); }

пример простейшей Qt-программы (правда, это Qt4, но сути не меняет).

#36996
Hvzh написал:
Тогда Вам действительно нужно начать с азов. Вот

Спасибо, на счёт этого я в курсе.
Но ведь файл calc1.cpp создаётся qmake`ом при компиляции. В него нужно добавить main() или какая-то ошибка при компиляции возникает?

#36997
clp написал:
Но ведь файл calc1.cpp создаётся qmake`ом при компиляции

При компиляции чего?

Вы в какой среде это делаете?

#36998

Сначало. Создаю форму ,размещаю на ней кнопки и прочее в Qt Designer`e. Создаю слоты, с чем они взаимодействуют и прочее. Получаю в конечном итоге файл calc1.ui.h, в котором форма и код того, что она делает. после даю команду
qmake -project
qmake calc1.pro
тут создаются файлы типа calc1.cpp и т.д.
после команды make вылазит ошибка, которую приводил вначале поста.
Я что-то сделал не так? Вроде бы всё вполне логично и адекватно, извините, если туплю =)

#36999

Ну, раз решили все делать ручками, то тогда добавляете main примерно такого вида

text
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    Form1 *form = new Form1();
    form->show();
    return app.exec();
}
#37000

Когда мне потребовалось начать работать с Qt, это была ещё Qt-2.x, я сначала
посмотрел книгу на английском, потом взял готовый пример из документации
к Qt и начал с ним что-то делать. При этом я Qt-Designer не использовал и в Qt-3.x
не использовал и Makefile, там достаточно подключить libqt-mt или что-то похожее,
а Makefile получался излишне большим, если его строить.
В Qt-4 проще с Makefile, но я в ней ничего нового не делал, только перевел на неё
программы с Qt-3.

Так что рекомендую приобрести книгу по Qt, они давно есть на русском,
и учиться на уже работаюших примерах.

Пётр.

#37002
Hvzh написал:
Ну, раз решили все делать ручками, то тогда добавляете main примерно такого вида

Всмысле "всё делать ручками"? Вроде бы не читал про другие способы, наверное мало прочитал ещё.
Добавил, спасибо, только понял что примерно надо добавить и увидел Ваше сообщение. Теперь появилась новая ошибка


calc1.cpp: In function ‘int main(int, char**)’:
calc1.cpp:170: error: variable ‘QApplication app’ has initializer but incomplete type
make: *** [calc1.o] Ошибка 1
Peter написал:
Так что рекомендую приобрести книгу по Qt, они давно есть на русском,
и учиться на уже работаюших примерах.

Да, спасибо, у меня уже имеется книга "Разработка графического интерфейса с помощью библиотеки Qt3", пытаюсь изучать =)

Ура! Скомпилировалось и работает.Спасибо за помощь! Последняя ошибка возникла из-за того, что забыл приписать в calc1.cpp #include <qapplication.h> теперь всё работает. Тему можно закрывать. Ещё раз спасибо =)

#37006
clp написал:
Последняя ошибка возникла из-за того, что забыл приписать в calc1.cpp #include <qapplication.h>

Я предупреждал :) Пример был для Qt4. Кстати, непонятно, почему Вы изучаете Qt3, а не Qt4? Qt3 - это давно уже неактуально

#37007
Hvzh написал:
Я предупреждал smile Пример был для Qt4. Кстати, непонятно, почему Вы изучаете Qt3, а не Qt4? Qt3 - это давно уже неактуально

Курсовую по информатике писал. Преподователь сказал использовать qt3, сейчас вот с ней закончу и буду переходить на qt4, т.к., как Вы и сказали он актуальней.
Спасибо за помощь =)

#37008
clp написал:
Всмысле "всё делать ручками"? Вроде бы не читал про другие способы, наверное мало прочитал ещё.

Ставите QtCreator и больше не паритесь с такими проблемами (правда, это опять для Qt4). А книгу советую Макса Шлее: "Qt4.5. Профессиональное программирование на C++"

#37009

Ясно. Поставлю qt 4 и буду обучаться уже ему. Ещё раз спасибо за помощь. =)
Думаю, что темку можно закрывать. :)

Войдите или зарегистрируйтесь, чтобы ответить.