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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Как собрать и запустить 32битное приложение Qt в 64битном Linux?  (Прочитано 28364 раз)
Andrey23168
Гость
« : Март 31, 2016, 17:29 »

Не могу собрать и запустить 32битное приложение Qt в 64битном Linux. Компилятор GCC x86 32bit определяется сам. Но, при попытке выбрать его загорается красная иконка с восклицательным знаком: “Компилятор “GCC(x86 32bit в usr/bin)” (x86-linux-generic-elf-32bit) Не может создавать код для профиля Qt”Qt5.3.0 в PATH(qt5)” (x86-linux-generic-elf-64bit).”.
Собственно, почему? И как сделать чтобы мог?
Далее, если проигнорировать предупреждение, Creator выдаст ошибки:
/usr/bin/ld: skipping incompatible /usr/lib/x86_64-linux-gnu/libQt5Widgets.so when searching for -lQt5Widgets
/usr/bin/ld: cannot find -lQt5Widgets
/usr/bin/ld: skipping incompatible /usr/lib/x86_64-linux-gnu/libQt5Gui.so when searching for -lQt5Gui
/usr/bin/ld: cannot find -lQt5Gui
/usr/bin/ld: skipping incompatible /usr/lib/x86_64-linux-gnu/libQt5Core.so when searching for -lQt5Core
/usr/bin/ld: cannot find -lQt5Core
/usr/bin/ld: skipping incompatible /usr/lib/x86_64-linux-gnu/libGL.so when searching for -lGL
/usr/bin/ld: cannot find -lGL
/usr/bin/ld: skipping incompatible /usr/lib/x86_64-linux-gnu/libpthread.so when searching for -lpthread
/usr/bin/ld: skipping incompatible /usr/lib/x86_64-linux-gnu/libpthread.a when searching for -lpthread
collect2: error: ld returned 1 exit status
Эти библиотеки 64 битные и они ни на месте. С 64 битным компилятором все работает. В руководстве по кросс-компиляции, что я нашел, было написано что: “Так же можно заметить, что системный x64 GCC в linux умеет генерировать и 32-битные приложения. Однако это не отменяет того, что также необходимы 32-битные версии библиотек.”.
То есть, мне нужны библиотеки: libQt5Widgets.so; libQt5Gui.so; libQt5Core.so; libGL.so; libpthread.so; libpthread.a; в 32битах? Или имеются в виду какие-то другие? Просто, странно что такие махинации были обойдены в том руководстве. Такое ощущение что, это должно работать по умолчанию. И только у меня, почему-то не хочет.
Помогите!
Записан
maint
Гость
« Ответ #1 : Март 31, 2016, 17:40 »

а 32 битные библиотеки кто устанавливать будет? Они не ставятся по умолчанию на 64 разрядные системы, за излишеством
Записан
Andrey23168
Гость
« Ответ #2 : Март 31, 2016, 17:50 »

To maint
Какие нужны библиотеки? libQt5Widgets.so; libQt5Gui.so; libQt5Core.so; libGL.so; libpthread.so; libpthread.a? В менеджере пакетов ничего нет про второй вариант библиотек Qt 32bit. Единственное что приходит в голову это: поставить на виртуалку 32битный линукс и оттуда стащить. Обычно это так делается? И как потом сказать креатору где лежат библиотеки?
пс. Я в linux плохо разбираюсь.
Записан
maint
Гость
« Ответ #3 : Март 31, 2016, 18:08 »

что значит нету? Библиотеки есть. Я не знаю какой линух у вас, в федоре, например,  поиск даст выбор пакетов qt5-qtbase.x86-64 и qt5-qtbase.i686. Ставить нужно соотвественно qt5-qtbase.i686 для 32 разрядов на 64 разрядной системе. Для fedora 23 -  dnf install qt5-qtbase.i686. Для дебиан систем (ubuntu в них же),  apt-get install qt5-qtbase.i686 или что то подобное.
Записан
AlekseyK
Гость
« Ответ #4 : Апрель 01, 2016, 07:15 »

To maint
пс. Я в linux плохо разбираюсь.

Надо научиться лучше разбираться - полезно! Улыбающийся Какой дистрибутив у Вас? В openSUSE есть например пакеты с префиксом 32bit для таких случаев. Нужно также убедиться, что 32 битный gcc установлен. Зайдите в менеджер пакетов Вашего дистрибутива и посмотрите, что есть. Доустановите необходимое.
Записан
Andrey23168
Гость
« Ответ #5 : Апрель 01, 2016, 11:04 »

Astra Linux. Пока я пытался разобраться сам, я решил не мелочиться и поставил все пакеты, которые содержали в названии libqt5. Есть еще libqt4 и даже 3, но я не думаю, что они могут помочь.
Значит в дебиане64 есть все что нужно? Поставлю его и попробую собрать не нем. Сколько он там весит? 5 двд дисков? Окей…
Если получится, надо будет как-то перенести нужные пакеты и или библиотеки на астру. Как такое делается в линуксе?
Записан
Andrey23168
Гость
« Ответ #6 : Апрель 04, 2016, 17:06 »

Скачал я в итоге дебиан. Я поставил все библиотеки libqt и 4 и 5, кроме тех что конфликтовали. Все что нашел по gcc и g++ и lib32. Все равно не заработало.
Вот консоль сборки полностью:
15:38:46: Выполняются этапы для проекта HelloTest32...
15:38:46: Настройки не изменились, этап qmake пропускается.
15:38:46: Запускается: «/usr/bin/make»
/usr/lib/x86_64-linux-gnu/qt5/bin/uic ../3helotest5/mainwindow.ui -o ui_mainwindow.h
g++ -c -m32 -pipe -O2 -Wall -W -D_REENTRANT -fPIE -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++-32 -I../3helotest5 -isystem /usr/include/x86_64-linux-gnu/qt5 -isystem /usr/include/x86_64-linux-gnu/qt5/QtWidgets -isystem /usr/include/x86_64-linux-gnu/qt5/QtGui -isystem /usr/include/x86_64-linux-gnu/qt5/QtCore -I. -I. -I. -o main.o ../3helotest5/main.cpp
g++ -c -m32 -pipe -O2 -Wall -W -D_REENTRANT -fPIE -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++-32 -I../3helotest5 -isystem /usr/include/x86_64-linux-gnu/qt5 -isystem /usr/include/x86_64-linux-gnu/qt5/QtWidgets -isystem /usr/include/x86_64-linux-gnu/qt5/QtGui -isystem /usr/include/x86_64-linux-gnu/qt5/QtCore -I. -I. -I. -o mainwindow.o ../3helotest5/mainwindow.cpp
/usr/lib/x86_64-linux-gnu/qt5/bin/moc -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++-32 -I/home/jo/Документы/3helotest5 -I/usr/include/x86_64-linux-gnu/qt5 -I/usr/include/x86_64-linux-gnu/qt5/QtWidgets -I/usr/include/x86_64-linux-gnu/qt5/QtGui -I/usr/include/x86_64-linux-gnu/qt5/QtCore -I. -I/usr/include/c++/4.9 -I/usr/include/x86_64-linux-gnu/c++/4.9 -I/usr/include/c++/4.9/backward -I/usr/lib/gcc/x86_64-linux-gnu/4.9/include -I/usr/local/include -I/usr/lib/gcc/x86_64-linux-gnu/4.9/include-fixed -I/usr/include/x86_64-linux-gnu -I/usr/include ../3helotest5/mainwindow.h -o moc_mainwindow.cpp
g++ -c -m32 -pipe -O2 -Wall -W -D_REENTRANT -fPIE -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++-32 -I../3helotest5 -isystem /usr/include/x86_64-linux-gnu/qt5 -isystem /usr/include/x86_64-linux-gnu/qt5/QtWidgets -isystem /usr/include/x86_64-linux-gnu/qt5/QtGui -isystem /usr/include/x86_64-linux-gnu/qt5/QtCore -I. -I. -I. -o moc_mainwindow.o moc_mainwindow.cpp
g++ -m32 -Wl,-O1 -o HelloTest32 main.o mainwindow.o moc_mainwindow.o   -lQt5Widgets -L/usr/X11R6/lib64 -lQt5Gui -lQt5Core -lGL -lpthread
/usr/bin/ld.bfd.real: cannot find -lQt5Widgets
/usr/bin/ld.bfd.real: cannot find -lQt5Gui
/usr/bin/ld.bfd.real: cannot find -lQt5Core
/usr/bin/ld.bfd.real: cannot find -lGL
Makefile:145: recipe for target 'HelloTest32' failed
collect2: error: ld returned 1 exit status
make: *** [HelloTest32] Error 1
15:38:49: Процесс «/usr/bin/make» завершился с кодом 2.
Ошибка при сборке/установке проекта HelloTest32 (комплект: Desktop)
When executing step "Сборка"
15:38:49: Прошло времени: 00:02.

Я мучил федору. Поставил креатор. Вбил в нее dnf install qt5-qtbase.i386. Но при попытке сборки получил ошибку. Нашел решение, вбил dnf install stubs-32.h. Опять ошибка, нашел решение, dnf install qt0devel.i686. И получил те же самые ошибки что и на дебиане. Там не было менеджера пакетов, чтобы поставить все… и, я бросил попытки.
Может, нужны какие-то настройки креатора? Или надо делать в консоли? Еще меня смущает профиль qt, то есть qmake. В статье по кросс-компиляции что мне все время попадается, автор возится с configure и qmake.conf. Однако, не упоминает подобных действия по отношению к компиляции линукс32. Может нужно что-то с этим сделать?
Неужели знания о компиляции программ линукс32 в системе линукс64 были утеряны со времен 2013 года? Неужели теперь, никто не знает что делать?
« Последнее редактирование: Апрель 04, 2016, 17:08 от Andrey23168 » Записан
Andrey23168
Гость
« Ответ #7 : Апрель 07, 2016, 17:46 »

А вот и я! За это время я немного продвинулся в восстановлении занесенных песками времени знаний по сборке и запуске 32битных приложений Qt в 64битном Astra Linux. Я знаю, что когда-то «Древние» могли так делать. Но спустя годы знания были утрачены… Очень интересно самому восстанавливать древние утерянные знания, но если вы можете мне как-то помочь, не стесняйтесь! напишите в этом форуме как это делалось!
Оказывается, в openSUSE это возможно, если поставить нужные библиотеки. Собственно, теперь нужно перенести это богатство в Astra Linux. Я не знаю, как стянуть пакет из одного линукса и поставить в другой. По этому, не долго думая, я скопировал папку /usr/lib из openSUSE в Astra Linux /usr/comp. Это ведь разрешено лицензионными соглашениями?
Ну да ладно. Я отчаялся чего-то добиться от креатора, поэтому:
1.   Очистил проект в креаторе
2.   Собрал снова, и скопировал последнюю строчку из консоли, после которой сыплются ошибки (g++ -m32 -Wl,-O1 -o HelloTest32 main.o mainwindow.o moc_mainwindow.o   -lQt5Widgets -L/usr/X11R6/lib64 -lQt5Gui -lQt5Core -lGL -lpthread)
3.   Стал писать ее в консоли с некоторыми изменениями.
Естественно, после указания недостающих библиотек ничего не заработало. Требуются еще библиотеки, а они есть у меня. Я пришел к такому виду строчки:
g++ -m32 -Wl,-O1 -o HelloTest32 main.o mainwindow.o moc_mainwindow.o   /usr/comp/libQt5Widgets.so.5.5.1 -L/usr/X11R6/lib64 /usr/comp/libQt5Gui.so.5.5.1 /usr/comp/libQt5Core.so.5.5.1 -lGL -lpthread /usr/comp/libgobject-2.0.so.0.4400.1 /usr/comp/libglib-2.0.so.0.4400.1 /usr/comp/libpng16.so.16.8.0 /usr/comp/libharfbuzz.so.0.10000.3 /usr/comp/libicui18n.so.52.1 /usr/comp/libicuuc.so.52.1 /usr/comp/libpcre16.so.0.2.1 /usr/comp/libffi.so.4.0.1 /usr/comp/libpcre.so.1.2.1 /usr/comp/libgraphite2.so.3.0.1 /usr/comp/libicudata.so.52.1
И уткнулся в сложноразрешимую проблему:
usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.7/libstdc++.so when searching for -lstdc++
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.7/libstdc++.a when searching for -lstdc++
/usr/bin/ld: cannot find -lstdc++
Этот libstdc++.so.6.0.17 не получилось также подоткнуть. Единственное что пришло мне в голову это заменить его на аналогичный из openSUSE. После этого приложения перестали запускаться, нельзя было выйти из режима блокировки, система перезагружалась только в режим консоли. Я даже готов был с этим смириться лишь бы собралась моя програмка…
Но не тут-то было:
/usr/lib/gcc/x86_64-linux-gnu/4.7/libstdc++.so: undefined reference to `__cxa_thread_atexit_impl@GLIBC_2.18'
/usr/comp/libglib-2.0.so.0.4400.1: undefined reference to `clock_gettime@GLIBC_2.17'
/usr/comp/libQt5Core.so.5.5.1: undefined reference to `__fdelt_chk@GLIBC_2.15'
Даже не знаю, как с undefined reference в таком виде бороться. Если подоткнуть -lGL –lpthread руками попросит еще библиотек, в итоге:
g++ -m32 -Wl,-O1 -o HelloTest32 main.o mainwindow.o moc_mainwindow.o   /usr/comp/libQt5Widgets.so.5.5.1 -L/usr/X11R6/lib64 /usr/comp/libQt5Gui.so.5.5.1 /usr/comp/libQt5Core.so.5.5.1 /usr/comp/libGL.so.1.2.0 /usr/comp/libpthread-2.19.so /usr/comp/libgobject-2.0.so.0.4400.1 /usr/comp/libglib-2.0.so.0.4400.1 /usr/comp/libpng16.so.16.8.0 /usr/comp/libharfbuzz.so.0.10000.3 /usr/comp/libicui18n.so.52.1 /usr/comp/libicuuc.so.52.1 /usr/comp/libpcre16.so.0.2.1 /usr/comp/libffi.so.4.0.1 /usr/comp/libpcre.so.1.2.1 /usr/comp/libgraphite2.so.3.0.1 /usr/comp/libicudata.so.52.1 /usr/comp/libglapi.so.0.0.0 /usr/comp/libX11-xcb.so.1.0.0 /usr/comp/libxcb-glx.so.0.0.0 /usr/comp/libxcb-dri3.so.0.0.0 /usr/comp/libxcb-dri2.so.0.0.0 /usr/comp/libxcb-present.so.0.0.0 /usr/comp/libxcb-sync.so.1.0.0 /usr/comp/libxshmfence.so.1.0.0
После вот этого я все равно прихожу к:
/usr/comp/libpthread-2.19.so: undefined reference to `__mktemp@@GLIBC_PRIVATE'
/usr/comp/libGL.so.1.2.0: undefined reference to `xcb_poll_for_special_event'
/usr/lib/gcc/x86_64-linux-gnu/4.7/libstdc++.so: undefined reference to `__cxa_thread_atexit_impl@GLIBC_2.18'
/usr/comp/libpthread-2.19.so: undefined reference to `__madvise@@GLIBC_PRIVATE'
/usr/comp/libglib-2.0.so.0.4400.1: undefined reference to `clock_gettime@GLIBC_2.17'
/usr/comp/libxcb-dri3.so.0.0.0: undefined reference to `xcb_get_reply_fds'
/usr/comp/libxcb-dri3.so.0.0.0: undefined reference to `xcb_send_fd'
/usr/comp/libpthread-2.19.so: undefined reference to `__ctype_init@@GLIBC_PRIVATE'
/usr/comp/libQt5Core.so.5.5.1: undefined reference to `__fdelt_chk@GLIBC_2.15'
/usr/comp/libGL.so.1.2.0: undefined reference to `xcb_wait_for_special_event'
/usr/comp/libGL.so.1.2.0: undefined reference to `_XGetRequest'
/usr/comp/libGL.so.1.2.0: undefined reference to `xcb_unregister_for_special_event'
/usr/comp/libpthread-2.19.so: undefined reference to `__call_tls_dtors@@GLIBC_PRIVATE'
/usr/comp/libGL.so.1.2.0: undefined reference to `xcb_register_for_special_xge'
Мне начинает казаться что это тупиковый вариант…
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #8 : Апрель 07, 2016, 18:21 »

А зачем вообще нужен такой гемор? Почему нужно именно 32-битное? Если Astra Linux не поддерживает multiarch, то гемороя будет столько, что мало не покажется.
Записан
Andrey23168
Гость
« Ответ #9 : Апрель 08, 2016, 12:09 »

To Alex Custov
Если бы нужно было мне лично, я бы давно это дело бросил. Но мне по работе… Причина есть, но, документы о неразглашении я не читал, но подписывал. Я не уверен, что могу это рассказывать. Начальство уверено, что именно так все и должно быть сделано.
Я уже жаловался начальству, что это НЕВОЗМОЖНОООО!!!! На что мне было предложено пересобрать Qt в 32битном режиме, но это сложно. Это может помочь?
В Astra Linux есть пакеты:
Binutils-multiarch v2.22-8 Binary utilities that support multi-arch targets
Gdb-multiarch v 7.4.1+dfsg-0.1 The GNU Debugger (with support for multiple architectures)
Multiarch-support 2.13-38+deb7u1as Transnational pacage ensure multiarch compatibility
Но, их установка ничего не дает.
Я добавил путь к libc-2.19.so к своей мути:
g++ -m32 -Wl,-O1 -o HelloTest32 main.o mainwindow.o moc_mainwindow.o   /usr/comp/libQt5Widgets.so.5.5.1 -L/usr/X11R6/lib64 /usr/comp/libQt5Gui.so.5.5.1 /usr/comp/libQt5Core.so.5.5.1 -lGL -lpthread /usr/comp/libgobject-2.0.so.0.4400.1 /usr/comp/libglib-2.0.so.0.4400.1 /usr/comp/libpng16.so.16.8.0 /usr/comp/libharfbuzz.so.0.10000.3 /usr/comp/libicui18n.so.52.1 /usr/comp/libicuuc.so.52.1 /usr/comp/libpcre16.so.0.2.1 /usr/comp/libffi.so.4.0.1 /usr/comp/libpcre.so.1.2.1 /usr/comp/libgraphite2.so.3.0.1 /usr/comp/libicudata.so.52.1 /usr/comp/libc-2.19.so -L/lib32
И получил ошибку:
/usr/comp/libc-2.19.so: undefined reference to `_dl_find_dso_for_object@GLIBC_PRIVATE'
Интересно, это решились прошлые ошибки и добавилась одна новая? Или это новая ошибка затмившая прошлые?
Я двигаюсь в правильном направлении? И если нет, как лучше решить мою задачу?
Записан
AlekseyK
Гость
« Ответ #10 : Апрель 11, 2016, 20:26 »

Ставь openSUSE, там таких проблем нет - поставил и работает! Там ещё есть Build Service - потом сможешь собирать под любую битность и любой дистрибутив.

А переносить библиотеки - это не вариант: пути могуть быть другие, другая версия Qt, gcc и т.п., про ldd не забудь, так что вероятность, что это всё будет работать  - минимальная.
Записан
ssoft
Программист
*****
Offline Offline

Сообщений: 583


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

Имел опыт сборки 32 бит на Oracle Linux 64 bit.
Устанавливал все пакеты от которых зависит Qt (...qt4-dev-....rpm)
Собирал Qt-4.7.4 из исходников.
Все собралось, даже запустилось, но.. шрифты не стали работать, английский выглядел убого, а русский вообще не отображался.
Итог, рефакторинг проекта для поддержки 64 бит. Дальше не стал заморачиваться.
Записан
Andrey23168
Гость
« Ответ #12 : Апрель 12, 2016, 17:04 »

To AlekseyK
Все должно функцианировать в 64bit Astra Linux, я не могу использовать другие ОС. Даже программы и компоненты не желательно чужие брать. Но, по другому никак.

To ssoft
Я уже все перепробовал. И думаю собирать qt. Надеюсь мне повезет. Не могли бы вы дать мне какой-нибудь совет или наставление? Какой инструкцией вы пользовались или где взяли знания для этих действий?
Записан
AlekseyK
Гость
« Ответ #13 : Апрель 13, 2016, 00:40 »

To AlekseyK
Все должно функцианировать в 64bit Astra Linux, я не могу использовать другие ОС. Даже программы и компоненты не желательно чужие брать. Но, по другому никак.
А понятно - это наша супер защищённая разработка, тогда конечно. Непонятно только зачем 32 битной программе нужно крутиться на 64 битном линуксе. Астра сделана на Qt, странно, что там нет 32 битных её версий. Или Вы не нашли? Посмотрите список пакетов, есть графическая утилита там для этого. Основана на пакетах .deb, значит можно доставлять с дебиана или убунту. Разберитесь с пакетами, гораздо проще и эффективнее, чем в винде всё устроено. Вот посмотрите как подключаются репозитории из дебиана, если в оригинале каких-то пакетов нет: http://astralinux.blogspot.com/2015/11/debian-astra-linux-ce-1105-orel-linux.html, http://www.sakryukin.ru/?module=articles&c=articles&b=8&a=45

P.S. Посмотрел какие пакеты есть в астре, бедноватый конечно репозиторий, как говорят, по причине безопасности. Но всегда можно подключить дебиановские репозитории с пакетами i686: http://www.sakryukin.ru/?module=articles&c=articles&b=8&a=45
Записан
ssoft
Программист
*****
Offline Offline

Сообщений: 583


Просмотр профиля
« Ответ #14 : Апрель 13, 2016, 09:12 »

To ssoft
Я уже все перепробовал. И думаю собирать qt. Надеюсь мне повезет. Не могли бы вы дать мне какой-нибудь совет или наставление? Какой инструкцией вы пользовались или где взяли знания для этих действий?

Все решалось методом проб и ошибок).
Берем, например, пакет qt-everywhere-opensource-src-4.7.4.tar.gz.

Если в репозитории ОС есть пакет qt...-dev-... для любой версии qt4, то его лучше поставить, так как большинство (если не все) зависимостей он в себе содержит. Вообще перечень зависимостей для Qt4 перечислен здесь http://doc.qt.io/qt-4.8/requirements-x11.html.

Запускаем configure с нужными параметрами - Linux32, OpenGL, no-examples и т.п. (возможные параметры смотрим через configure --help).
По сообщениям об ошибках, анализируем чего не хватает и чем можно пожертвовать. Ушел почти день.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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