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