LINUX.ORG.RU

Компеляция QT проекта по x64 не понятный глюк

 


1

1

Добрый день. Помогите понят почему такой глюк. Пишу программу на QT для работы с сокетами, написал клинскую часть на на QT для Orange PI, всё собралось и работает как часы. Начал писать серверную часть пишу windows, поставил компилятор под x64 всё собирается нормально запускается но при этом программа глючит, подключаюсь к сокету и больше не чего не работает. Удалил компилятор под x64 поставил под 32 бита проблема исчезла. Написал серверную часть программы. Начал собирать под linux x64(debian), и проблема повторилась, собралось, но также работает не корректно. Помогите понять иза чего? Собираю вот так, через консоль.

qmake -project "CONFIG+=QT" "QT+=network"
qmake server.pro
make

Возможно потому что где-то ты думаешь, что void * равен 4, тогда как на x86_64 он равен 8. Это одна из самых популярных проблем.

Вот тут есть подборка различных статей, которые охватывают проблемы переноса кода 32 => 64:

https://www.viva64.com/ru/b/0188/

EXL ★★★★★
()
Последнее исправление: EXL (всего исправлений: 1)
Ответ на: комментарий от EXL

Странно я всегда думал, что проста собираешь проект под нужную битность проблем не должно быть. Ведь иза этого и выбрал QT думал раз написал и забыл. И теперь нужно весь код переделывать по x64? либо компилировать по x32

mannaz2004
() автор топика
Ответ на: комментарий от slovazap

Яж говорю ставил qt под windows к нему поставил компилятор х64, думаю раз windows x64 пускай будет под x64. Начал писать качать примеры с интернета проста для работы сокета в режиме сервера. А они не работают думал косячные примеры. Потом на другой комп поставил qt на 32 битную windows там этот же код работал корректно. Потом я удалил компилятор под x64 поставил под x32 и всё заработало должным образом. Думал косяк чисто на windows, начал собирать на linux x64 точно также себя проявил. Проект у меня консольный.

mannaz2004
() автор топика
Ответ на: комментарий от mannaz2004

Странно я всегда думал, что проста собираешь проект под нужную битность проблем не должно быть. Ведь иза этого и выбрал QT думал раз написал и забыл.

Не забывай, что «под капотом» у Qt находится C++. Твоё утверждение больше подходит для скриптовых и VM-языков.

И теперь нужно весь код переделывать по x64? либо компилировать по x32

Нужно локализовать проблему и исправить её.

EXL ★★★★★
()
Ответ на: комментарий от mannaz2004

Я повторяю - почему ты считаешь что проблема не у тебя в коде?

slovazap ★★★★★
()

Удалил компилятор под x64 поставил под 32 бита проблема исчезла.

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

xaizek ★★★★★
()

Собирал под х64, все было норм. Отлаживай свой код.

anonymous
()
Ответ на: комментарий от mannaz2004

Ведь иза этого и выбрал QT думал раз написал и забыл

Ты пишешь не на Qt, а на C++. В Qt вагон макросов которые большинство не используют, а делают по своему на плюсах.

bhfq ★★★★★
()

санитайзеры и валгринд натравливал?

подключаюсь к сокету и больше не чего не работает

То есть не реагирует на внешние события? Подцепись отладчиком, хотя бы место конкретное будет. Ставлю на приведение указателя к инту или переполнение лонга

DllMain
()
Ответ на: комментарий от mannaz2004

Яж говорю ставил qt под windows к нему поставил компилятор х64

тут ты делаешь чтото не так - в составе offline инсталлятора qt уже идет компилятор и 64 и 32 бита (на выбор)
и примеры «с интернета» брать не надо, в составе qt есть все необходимые примеры - или ты сырые сокеты решил использовать, а не qtcpsoket\qtcpserver ?
думаю проблема в твоем коде, а раз ты его не показал, то считаем, что так оно и есть

x905 ★★★★★
()
Ответ на: комментарий от x905

Яж говорю взял пример в интернете много поточный сервер. Добавил в него свой код. Даже компилирую исходный пример. Он не работает на x64. Вот отсуда https://www.bogotobogo.com/cplusplus/sockets_server_client_QT.php MultiServer.tar.gz

mannaz2004
() автор топика
Последнее исправление: mannaz2004 (всего исправлений: 2)
Ответ на: комментарий от DllMain

Для меня пока это сложно. По мне так это чисто воды глюк. Я и за этого и выбрал QT чтоб не заморачиваться со всякими там дебрями, мне нужно чтоб было всё проста, и чтоб я мог собрать свой код на linux комне, на Orange PI, на WIN. Для моей задачи считать GPIO ножку отправить её состояние через сокет на той стороне его принять, и выполнить действия.

mannaz2004
() автор топика
Ответ на: комментарий от mannaz2004

Для меня пока это сложно.

В Qt много нюансов

По мне так это чисто воды глюк

Когда я начинал работать с Qt, то первые три месяца я так же думал

Я и за этого и выбрал QT чтоб не заморачиваться со всякими там дебрями

Тебе скриптуху надо тогда. Rust, например. Там как раз для умственно-незамороченных

К слову ты даже не написал какой компилятор использовал. MSVC или MinGW. Потому что там очень много различий.

anonymous
()
Ответ на: комментарий от mannaz2004

Попробуй MSVC для начала. MinGW не так давно адаптировали под 64-бит. У меня у самого были два раза проблемы с этим. И это не проблема Qt - это проблема компилятора.

Во-вторых, мне не нравится в твоём коде из примера использование qint64. Особенно если ты с MinGW работаешь.

Сам для винды использую MSVC в 99% случаев под 64-бит.

anonymous
()
Ответ на: комментарий от mannaz2004

Зря. Там всего-то флаги передать -fsanitize=undefined,address,leak(при компоновке тоже) и запустить. Под винду их вроде нет, но ты ж говоришь под линуксом тоже воспроизводится

DllMain
()

Вычисти все предупреждения компилятора в своем коде и скорее всего ошибка пропадет.

Serral
()
Ответ на: комментарий от mannaz2004

Он не работает на x64. Вот отсуда

т.е. после сборки сервер стартует, но не принимает подключения ?

x905 ★★★★★
()
Ответ на: комментарий от mannaz2004

внимательно смотрим тут https://doc.qt.io/qt-5/qtcpserver.html#incomingConnection , а затем код, который написан неправильно
есть же нормальные примеры из поставки qt, не используй неверный сторонний код (наследоваться от qthread также не рекомендуется)

x905 ★★★★★
()
Ответ на: комментарий от x905

Спасибо большое. Вы оказались правы. В примере был не тот тип. и в доке было указанно какой использовать тип, чтоб одинаково работала на всех платформах.

mannaz2004
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.