Russian Qt Forum

Qt => Общие вопросы => Тема начата: bigboa от Апрель 27, 2010, 20:50



Название: Помогите начинающему. Connect SIGNAL to SLOT
Отправлено: bigboa от Апрель 27, 2010, 20:50
 Доброго времени суток.

Появилась необходимось написать программу под linux.
Программа должна слушать TCP порт и в зависимости от полученных данных отправлять клиенту ответ. На системе, на которой писал и собирал проект все работает отлично. А вот на других системах не работает. Для тестов поставил KUbuntu 9.10. Запускаю на ней свою программу и получаю в ответ : Segmentation fault.
Поставил  valgrind и запустил с ним свою программу и вот что получил:

==2146== Memcheck, a memory error detector
==2146== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al.
==2146== Using Valgrind-3.5.0-Debian and LibVEX; rerun with -h for copyright info
==2146== Command: ./test
==2146==
==2146== Invalid read of size 4
==2146==    at 0x429550D: QMetaObject::indexOfSlot(char const* ) const (in /usr/lib/libQtCore.so.4.5.2)
==2146==    by 0x42A1268: QObject::connect(QObject const*, char const*, QObject const*, char const*, Qt::ConnectionType) (in /usr/lib/libQtCore.so.4.5.2)
==2146==    by 0x8049686: CNetServer::CNetServer() (cnetserver.cpp: 8 )
==2146==    by 0x8049454: main (main.cpp: 8 )
==2146==  Address 0x10 is not stack'd, malloc'd or (recently) free'd
==2146==
==2146==
==2146== Process terminating with default action of signal 11 (SIGSEGV)
==2146==  Access not within mapped region at address 0x10
==2146==    at 0x429550D: QMetaObject::indexOfSlot(char const* ) const (in /usr/lib/libQtCore.so.4.5.2)
==2146==    by 0x42A1268: QObject::connect(QObject const*, char const*, QObject const*, char const*, Qt::ConnectionType) (in /usr/lib/libQtCore.so.4.5.2)
==2146==    by 0x8049686: CNetServer::CNetServer() (cnetserver.cpp: 8 )
==2146==    by 0x8049454: main (main.cpp: 8 )
==2146==  If you believe this happened as a result of a stack
==2146==  overflow in your program's main thread (unlikely but
==2146==  possible), you can try to increase the size of the
==2146==  main thread stack using the --main-stacksize= flag.
==2146==  The main thread stack size used in this run was 8388608.
==2146==
==2146== HEAP SUMMARY:
==2146==     in use at exit: 82,312 bytes in 304 blocks
==2146==   total heap usage: 2,105 allocs, 1,801 frees, 164,108 bytes allocated
==2146==
==2146== LEAK SUMMARY:
==2146==    definitely lost: 0 bytes in 0 blocks
==2146==    indirectly lost: 0 bytes in 0 blocks
==2146==      possibly lost: 68,944 bytes in 43 blocks
==2146==    still reachable: 13,368 bytes in 261 blocks
==2146==         suppressed: 0 bytes in 0 blocks
==2146== Rerun with --leak-check=full to see details of leaked memory
==2146==
==2146== For counts of detected and suppressed errors, rerun with: -v
==2146== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 39 from 10)
Segmentation fault

Как я понял, ругается он именно на эту строчку в конструкторе класса:
...
connect (&server,SIGNAL(newConnection()),this,SLOT(acceptConnection()));
...

если ее закоментировать, то Segmentation fault не появляется.
Подскажите, пожалуйста, что все это означает и почему на системе на которой я собирал проект все работает??? 

Проект собран c помощью Qt Creator 1.3, Build Configuration -> Release.


Название: Re: Помогите начинающему. Connect SIGNAL to SLOT
Отправлено: kuzulis от Апрель 27, 2010, 20:58
на Kubuntu тоже пересоберите, а потом уже запускайте


Название: Re: Помогите начинающему. Connect SIGNAL to SLOT
Отправлено: BRE от Апрель 27, 2010, 21:00
Слишком мало информации.
Покажи код, хотя бы кусками, с пояснениями где вызывается connect, что в слоте acceptConnection, используются другие потоки или нет...
Попробуй использовать Qt по новее, сейчас уже 4.6.2.


Название: Re: Помогите начинающему. Connect SIGNAL to SLOT
Отправлено: bigboa от Апрель 27, 2010, 21:13
Я пишу тоже на KUbuntu 9.10.

CNetServer::CNetServer()
{
    server.listen(QHostAddress::Any,36036);
    connect (&server,SIGNAL(newConnection()),this,SLOT(acceptConnection()));
}

CNetServer::~CNetServer()
{
    server.close();
}

void CNetServer::acceptConnection()
{
//пусто
}


Название: Re: Помогите начинающему. Connect SIGNAL to SLOT
Отправлено: bigboa от Апрель 27, 2010, 21:16
Я пишу на Qt 4.6.2.  Может в этом и проблема? Может на тестовой машине стоит Qt версией ниже, если из-за этого то как мне обновить QtCore?


Название: Re: Помогите начинающему. Connect SIGNAL to SLOT
Отправлено: BRE от Апрель 27, 2010, 21:19
Я пишу на Qt 4.6.2.  Может в этом и проблема? Может на тестовой машине стоит Qt версией ниже, если из-за этого то как мне обновить QtCore?
Подожди, ты собираешь программу с Qt 4.6.2, а потом просто копируешь бинарник на другую машину?

На тестовой машине судя по этому используется 4.5.2
Цитировать
==2146==    at 0x429550D: QMetaObject::indexOfSlot(char const* ) const (in /usr/lib/libQtCore.so.4.5.2)


Название: Re: Помогите начинающему. Connect SIGNAL to SLOT
Отправлено: bigboa от Апрель 27, 2010, 21:25
Подожди, ты собираешь программу с Qt 4.6.2, а потом просто копируешь бинарник на другую машину?

Именно так, я совсем новичек в создании программ под линукс, мне кажется что так и надо делать или нет?


Название: Re: Помогите начинающему. Connect SIGNAL to SLOT
Отправлено: BRE от Апрель 27, 2010, 21:27
Именно так, я совсем новичек в создании программ под линукс, мне кажется что так и надо делать или нет?
Нужно собрать программу из исходников на целевой машине.


Название: Re: Помогите начинающему. Connect SIGNAL to SLOT
Отправлено: bigboa от Апрель 27, 2010, 21:43
Скопировал исходники, делаю make, не компилит, требует makefile. Как его сгенерить или его надо писать?



Название: Re: Помогите начинающему. Connect SIGNAL to SLOT
Отправлено: BRE от Апрель 27, 2010, 21:45
Скопировал исходники, делаю make, не компилит, требует makefile. Как его сгенерить или его надо писать?
А файл с расширением .pro присутствует?
Тогда сделай:
qmake
make


Название: Re: Помогите начинающему. Connect SIGNAL to SLOT
Отправлено: bigboa от Апрель 27, 2010, 21:58
файл .pro есть.

qmake
make
make: Nothing to be done for `first`

???


Название: Re: Помогите начинающему. Connect SIGNAL to SLOT
Отправлено: kuzulis от Апрель 28, 2010, 07:20
Цитировать
Цитата: BRE от Апрель 27, 2010,  22:19
Подожди, ты собираешь программу с Qt 4.6.2, а потом просто копируешь бинарник на другую машину?

Именно так, я совсем новичек в создании программ под линукс, мне кажется что так и надо делать или нет?

я ж уже тоже самое писал.. неужели никто не слышит?
Цитировать
на Kubuntu тоже пересоберите, а потом уже запускайте

:(

Цитировать
make: Nothing to be done for `first`

а пакеты для девелопинга в Kubuntu установлены?


Название: Re: Помогите начинающему. Connect SIGNAL to SLOT
Отправлено: kuzulis от Апрель 28, 2010, 07:22
Цитировать
файл .pro есть.
если *.pro есть, то делать нужно:
Цитировать
#make distclean
#qmake yuor.pro
#make


Название: Re: Помогите начинающему. Connect SIGNAL to SLOT
Отправлено: bigboa от Апрель 28, 2010, 11:14
Цитировать
а пакеты для девелопинга в Kubuntu установлены?

Я совсем новичек в программировании под linux, выходит чтоб запустить бинарник на другой системе, туда надо поставить чуть ли ни тот же SDK в котором он собирался, скомпилировать его, а уж потом запускать, так?

Есть ли, в принципе, возможность распространения софта под linux без перекомпеляции?


Название: Re: Помогите начинающему. Connect SIGNAL to SLOT
Отправлено: kuzulis от Апрель 28, 2010, 11:23
Цитировать
Я совсем новичек в программировании под linux, выходит чтоб запустить бинарник на другой системе, туда надо поставить чуть ли ни тот же SDK в котором он собирался, скомпилировать его, а уж потом запускать, так?

1. Суть в том, что разных дистрибутивов Gnu/Linux целый зоопарк. В каждом дистрибутиве могут быть разные версии libc, Glibc и т.д. и т.п. Поэтому бинарик, собранный в одном дистре может не работать в другом дистре. Для того чтобы оно заработало нужно учитывать много нюансов.

2. SDK нужно ставить только если вы что-то компилировать собрались. И не "тот же" - а обычный "стандартный" набор утилит для сборки приложений.

3. Linux - это вам не винда с одинаковыми *.dll и API, поэтому параллели тут не работают.

Цитировать
Есть ли, в принципе, возможность распространения софта под linux без перекомпеляции?

1. Да. При этом вы должны собрать свое приложение с нюансами:
 - где возможно - статически линковать
 - где возможно - использовать спец. ключи
 - и т.п.
 с целью как можно сильнее уменьшить зависимость вашего бинарика от системных библиотек GNU/Linux

2. НО обычно так никто не поступает (кроме некоторых крупных компаний - "жмотошников" и разнообразных индивидуумов которые хотят наварить денег и что-то там скрыть :) )


Название: Re: Помогите начинающему. Connect SIGNAL to SLOT
Отправлено: crossly от Апрель 28, 2010, 12:00
на самом деле проблема немного проще... автор собрал прогу с 4.6.2 и пытается за пустить ее с 4,5,3... вот и проблема.... если было бы на оборот то скорее всего запустилось бы без проблем...


Название: Re: Помогите начинающему. Connect SIGNAL to SLOT
Отправлено: bigboa от Апрель 28, 2010, 12:50
Странно как-то, попытался собрать проект руками, на той же системе на которой пиал его в Qt Creator.
Делаю следующее:

qmake -project           - все Ok
qmake                        - Ok
make                         - начал ругаться на текст программы:

@home:~/test/ScanDeamon$ make                                                                                                                                             
g++ -c -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_NETWORK_LIB -DQT_CORE_LIB -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtNetwork -I/usr/include/qt4 -I. -o main.o main.cpp                                                                                                                                             
main.cpp:1:35: error: QtCore/QCoreApplication: No such file or directory                                                                                                           
In file included from main.cpp:2:                                                                                                                                                   
./cnetserver.h:4:21: error: QtNetwork: No such file or directory                                                                                                                   
./cnetserver.h:5:22: error: QTcpServer: No such file or directory                                                                                                                   
./cnetserver.h:6:22: error: QTcpSocket: No such file or directory                                                                                                                   
./cnetserver.h:7:19: error: QObject: No such file or directory                                                                                                                     
In file included from main.cpp:2:                                                                                                                                                   
./cnetserver.h:10: error: expected class-name before ‘{’ token                                                                                                                     
./cnetserver.h:11: error: ISO C++ forbids declaration of ‘Q_OBJECT’ with no type                                                                                                   

и т.д.
Вопрос - почему в Qt Creator он не ругается и нормально компилится, а тут так разругался, система одна и та же??


Название: Re: Помогите начинающему. Connect SIGNAL to SLOT
Отправлено: BRE от Апрель 28, 2010, 12:53
Скорее всего у тебя установлено две версии Qt, одна Qt3, другая Qt4.
Для запуска qmake Qt3 - вызывается qmake, а для запуска qmake Qt4 - нужно звать что-то типа:
qmake-qt4 или qmake4 или ... (тут все от маинтайнера зависит).

А если ты устанавливал SDK сам, то звать нужно qmake с указанием полного пути, например:
/opt/Trolltech/bin/qmake


Название: Re: Помогите начинающему. Connect SIGNAL to SLOT
Отправлено: crossly от Апрель 28, 2010, 12:54
потому что когда ты собираешь в консоли компилятор ищет инклюды в системной директории.... QtCreator их ищет там где укажешь.... т.е. в Qt version в настройках....
+ тебе на установить dev-пакет qt.... в убунту что то примерно qt4-dev......
это все если ты хочешь собрать приложение с qt установленной в системе...


Название: Re: Помогите начинающему. Connect SIGNAL to SLOT
Отправлено: bigboa от Апрель 28, 2010, 13:17
проблема и правда в разных версиях qmake.
использовав qmake из SDK и файл .pro из проекта, все заработало.
Вот только как теперь это же повторить на другой машине, как не ставя полный SDK поставить туда нужный qmake и все остальное?


Название: Re: Помогите начинающему. Connect SIGNAL to SLOT
Отправлено: crossly от Апрель 28, 2010, 13:58
епть.... проблема не в qmake.... а в том что у тебя в СДК есть заголовочные файлы .... а в системе их нету... я вообще не понимаю нынешних молодых программистов.... без СДК и шагу и ступить не могут.... и о том как на самом деле происходит процесс сборки никакого понятия не имеют.... уф.... прошу прощения если что не так сказал...


Название: Re: Помогите начинающему. Connect SIGNAL to SLOT
Отправлено: bigboa от Апрель 28, 2010, 14:35
я, коенчно, понимаю, что правильнее было бы меня отправить к мануалам, но беда со сроками, поэтому и решил задать вопрос на форуме.

Скачал и поставил qt-everywhere-opensource-src-4.6.2, поставил libqt4-dev.
Дальше делаю так:

/home/nick/Downloads/qt-everywhere-opensource-src-4.6.2/bin/qmake /home/nick/test/ScanDeamon/ScanDeamon.pro -spec /home/nick/Downloads/qt-everywhere-opensource-src-4.6.2/mkspecs/linux-g++

make
и в результате все тоже самое, опять не видит инклудов, как указать путь к правильным инклудам? Инклуды системы ему, видимо, не нравятся...


Название: Re: Помогите начинающему. Connect SIGNAL to SLOT
Отправлено: crossly от Апрель 28, 2010, 14:41
о горе мне... :)... если вы поставил libqt4-dev то qt-everywhere-opensource-src-4.6.2 не нужно.... просто
Код:
qmake 
make clean
make


Название: Re: Помогите начинающему. Connect SIGNAL to SLOT
Отправлено: bigboa от Апрель 28, 2010, 19:48
Проблему решил. Переставил систему, поставил libqt4-dev, qt creator, скомпилировал программу, скопировал бинарник на тестовую систему и все работает на УРА!!!

Спасибо всем кто отвечал  :)