Russian Qt Forum
Октябрь 03, 2024, 05:37 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Помогите начинающему. Connect SIGNAL to SLOT  (Прочитано 13642 раз)
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.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #1 : Апрель 27, 2010, 20:58 »

на Kubuntu тоже пересоберите, а потом уже запускайте
Записан

ArchLinux x86_64 / Win10 64 bit
BRE
Гость
« Ответ #2 : Апрель 27, 2010, 21:00 »

Слишком мало информации.
Покажи код, хотя бы кусками, с пояснениями где вызывается connect, что в слоте acceptConnection, используются другие потоки или нет...
Попробуй использовать Qt по новее, сейчас уже 4.6.2.
Записан
bigboa
Гость
« Ответ #3 : Апрель 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()
{
//пусто
}
Записан
bigboa
Гость
« Ответ #4 : Апрель 27, 2010, 21:16 »

Я пишу на Qt 4.6.2.  Может в этом и проблема? Может на тестовой машине стоит Qt версией ниже, если из-за этого то как мне обновить QtCore?
Записан
BRE
Гость
« Ответ #5 : Апрель 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)
Записан
bigboa
Гость
« Ответ #6 : Апрель 27, 2010, 21:25 »

Подожди, ты собираешь программу с Qt 4.6.2, а потом просто копируешь бинарник на другую машину?

Именно так, я совсем новичек в создании программ под линукс, мне кажется что так и надо делать или нет?
Записан
BRE
Гость
« Ответ #7 : Апрель 27, 2010, 21:27 »

Именно так, я совсем новичек в создании программ под линукс, мне кажется что так и надо делать или нет?
Нужно собрать программу из исходников на целевой машине.
Записан
bigboa
Гость
« Ответ #8 : Апрель 27, 2010, 21:43 »

Скопировал исходники, делаю make, не компилит, требует makefile. Как его сгенерить или его надо писать?

Записан
BRE
Гость
« Ответ #9 : Апрель 27, 2010, 21:45 »

Скопировал исходники, делаю make, не компилит, требует makefile. Как его сгенерить или его надо писать?
А файл с расширением .pro присутствует?
Тогда сделай:
qmake
make
Записан
bigboa
Гость
« Ответ #10 : Апрель 27, 2010, 21:58 »

файл .pro есть.

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

Непонимающий
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #11 : Апрель 28, 2010, 07:20 »

Цитировать
Цитата: BRE от Апрель 27, 2010,  22:19
Подожди, ты собираешь программу с Qt 4.6.2, а потом просто копируешь бинарник на другую машину?

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

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

Грустный

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

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

ArchLinux x86_64 / Win10 64 bit
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #12 : Апрель 28, 2010, 07:22 »

Цитировать
файл .pro есть.
если *.pro есть, то делать нужно:
Цитировать
#make distclean
#qmake yuor.pro
#make
Записан

ArchLinux x86_64 / Win10 64 bit
bigboa
Гость
« Ответ #13 : Апрель 28, 2010, 11:14 »

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

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

Есть ли, в принципе, возможность распространения софта под linux без перекомпеляции?
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #14 : Апрель 28, 2010, 11:23 »

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

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

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

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

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

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

2. НО обычно так никто не поступает (кроме некоторых крупных компаний - "жмотошников" и разнообразных индивидуумов которые хотят наварить денег и что-то там скрыть Улыбающийся )
« Последнее редактирование: Апрель 28, 2010, 11:29 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.051 секунд. Запросов: 23.