Установка Qt 6.6.0 в РЕДОС Linux из официального зеркала Qt Company Ltd
После начала СВО на Украине Qt Company Ltd. закрыла доступ с российских адресов к основному зеркалу, с которого осуществлялась загрузка и установка готовых бинарных сборок фреймворка Qt и IDE QtCreator. Кроме того с версии 6 появилось обязательное требование входа в учетную запись Qt для установки программ. Всё это делает процесс установки и обновления неудобным и непрозрачным.
Все ниже написанное производится на только что установленной РЕДОС Linux 7.3.20230815.0, установленной в Hyper-V.
Сегодня мы установим Qt6 в РЕДОС Linux из официального зеркала Qt Company Ltd, доступного с российского ip-адреса.
Список зеркал мы получили в статье - Находим зеркала для установки Qt6 с Российских ip-адресов.
Установка пакетов
Установим инструменты разработки, которые нам понадобятся для сборки программ на Qt6:
yum groupinstall "Средства разработки"
yum install cmake libX11-devel libglvnd-opengl libglvnd-core-devel libglvnd-devel mesa-libEGL-devel yaml-cpp libxkbcommon-devel vulkan-devel
Процесс установки я расписал на схеме:
Создадим папку:
mkdir ~/qt660
cd ~/qt660
Создадим файл
mcedit 1-download.sh
С содержимым:
#! /bin/sh
wget --no-parent -r https://ftp.nluug.nl/languages/qt/online/qtsdkrepository/linux_x64/desktop/qt6_660/
Запустим:
chmod +x 1-download.sh
./1-download.sh
Данная команда создает полную копию папки languages/qt/online/qtsdkrepository/linux_x64/desktop/qt6_660/ с сервера в папке
~/qt660
Дождемся окончания загрузки – окончательный размер загруженный файлов приблизительно равен 1.5 Гб.
После окончания загрузки будет создана папка
ftp.nluug.nl
со всеми необходимыми файлами.
Нужные нам архивы находятся во множестве разных папок, нам же нужно, чтобы они находились в одной папке.
Скопируем архивы в одну папку:
Создаем файл
mcedit 2-copy.sh
С содержимым:
#! /bin/sh
cd ~/qt660
echo Копирование архивов в одну папку...
mkdir -p temp/7z
mkdir -p temp/tmp
find ~/qt660/ftp.nluug.nl ! -type d -exec bash -c '
for pathname do
if [ "$pathname" -nt "~/qt660/temp/tmp/${pathname##*/}" ]
then
cp "$pathname" ~/qt660/temp/tmp
fi
done' bash {} +
echo Файлы скопированы!
echo Перенос и очистка временных файлов...
mv ~/qt660/temp/tmp/*.7z ~/qt660/temp/7z
rm -drf ~/qt660/temp/tmp
echo Переснос и очистка закончены!
Запустим:
chmod +x 2-copy.sh
./2-copy.sh
После окончания копирования будет создана папка
~/qt6full/temp/7z
со всеми архивами *.7z
Теперь, когда все архивы находятся в одном месте их будет намного проще распаковать.
Создаем файл
mcedit 3-extract.sh
С содержимым:
#! /bin/sh
rm -drf ~/qt660/dist
cd ~/qt660/temp/7z
7z x -y -o../ "*.7z"
cd ~/qt660
echo Копируем файлы в папку dist...
mkdir ~/qt660/dist
cp -r ~/qt660/temp/6.6.0/gcc_64/* ~/qt660/dist
rm -drf ~/qt660/temp
echo Копирование завершено!
Запускаем
chmod +x 3-extract.sh
./3-extract.sh
Будет создана папка
~/qt6full/dist
с готовой к установке версией Qt 6.6.0
Теперь, когда у нас есть папка со всеми нужными файлами просто скопируем её в /usr/local/qt660
Создаем файл
mcedit 4-install.sh
С содержимым:
#! /bin/sh
rm -drf /usr/local/qt660
mkdir /usr/local/qt660
echo Копируем файлы в /usr/local/qt660 ...
cp -r dist/* /usr/local/qt660
echo Копирование завершено!
Запустим:
su
chmod +x 4-install.sh
./4-install.sh
Все необходимые файлы будут скопированы в папку /usr/local/qt660
Если мы сейчас попробуем получить номер версии Qt6 то у нас ничего не выйдет:
qmake6 -v
bash: qmake6: команда не найдена
Одного копирования файлов недостаточно, нам необходимо указать системе и другим программам где искать исполняемые файлы. Это можно сделать командами:
PATH=/usr/local/qt660/bin:$PATH
export PATH
Но и этого мало, если мы попробуем запустить программу собранную с использование фреймворка Qt6 то получим сообщение об ошибке:
: error while loading shared libraries: libQt6Graphs.so.6: cannot open shared object file: No such file or directory
Нам нужно указать системе где находятся дополнительные библиотеки для запуска программ:
LD_LIBRARY_PATH=/usr/local/qt660/lib:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH
Каждый раз запускать эти команды неудобно, тем более что в системе могут работать несколько пользователей и настраивать систему под каждого неэффективно!
В Linux существует папка
/etc/profile.d
Каждый раз когда любой пользователь запускает новый сеанс происходит запуск всех файлов *.sh из этой папки. Мы создадим файл:
/etc/profile.d/qt660.sh
Для инициализации всех необходимых системных переменных!
Создаем файл
mcedit 5-setupenv.sh
С содержимым:
#! /bin/sh
tee /etc/profile.d/qt660.sh > /dev/null << 'EOT'
PATH=/usr/local/qt660/bin:$PATH
export PATH
LD_LIBRARY_PATH=/usr/local/qt660/lib:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH
EOT
Запустим:
su
chmod +x 5-setupenv.sh
./5-setupenv.sh
Будет создан файл /etc/profile.d/qt660.sh с помощью которого, каждый раз, когда пользователь входит в систему, для него будут устанавливаться нужные переменные.
Перезагрузим ПК
reboot
После перезагрузки проверим:
qmake6 -v
QMake version 3.1
Using Qt version 6.6.0 in /usr/local/qt660/lib
Собираем программу из примеров Qt6
Проверим установленный фреймворк. Загрузим архив с примерами:
mkdir ~/projects
cd ~/projects
wget https://ftp.nluug.nl/languages/qt/online/qtsdkrepository/linux_x64/desktop/qt6_660_src_doc_examples/qt.qt6.660.examples.qtgraphs/6.6.0-0-202310040911qtgraphs-examples-6.6.0.7z
Распакуем:
7z x 6.6.0-0-202310040911qtgraphs-examples-6.6.0.7z
Запустим сборку:
cd Examples/Qt-6.6.0/graphs/axishandling
cmake .
-- The CXX compiler identification is GNU 11.4.1
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Failed
-- Check if compiler accepts -pthread
-- Check if compiler accepts -pthread - yes
-- Found Threads: TRUE
-- Performing Test HAVE_STDATOMIC
-- Performing Test HAVE_STDATOMIC - Success
-- Found WrapAtomic: TRUE
-- Found OpenGL: /usr/lib64/libOpenGL.so
-- Found WrapOpenGL: TRUE
-- Found XKB: /usr/lib64/libxkbcommon.so (found suitable version "1.0.0", minimum required is "0.5.0")
-- Found WrapVulkanHeaders: /usr/include
-- Configuring done
-- Generating done
-- Build files have been written to: /home/user/projects/Examples/Qt-6.6.0/graphs/axishandling
cmake --build .
[ 2%] Running qmlimportscanner for axishandling
[ 2%] Built target axishandling_qmlimportscan
[ 20%] Built target axishandling_tooling
[ 23%] Generating .rcc/qmlcache/axishandling_qmlcache_loader.cpp
[ 26%] Automatic MOC and UIC for target axishandling
[ 26%] Built target axishandling_autogen
[ 29%] Running AUTOMOC file extraction for target axishandling
[ 29%] Built target axishandling_automoc_json_extraction
[ 32%] Running moc --collect-json for target axishandling
[ 35%] Automatic QML type registration for target axishandling
[ 38%] Generating .rcc/qmlcache/axishandling_qml/axishandling/AxisDragging_qml.cpp
[ 41%] Generating .rcc/qmlcache/axishandling_qml/axishandling/AxisFormatting_qml.cpp
[ 44%] Generating .rcc/qmlcache/axishandling_qml/axishandling/Data_qml.cpp
[ 47%] Generating .rcc/qmlcache/axishandling_qml/axishandling/main_qml.cpp
[ 50%] Running rcc for resource axishandling_raw_qml_0
[ 52%] Running rcc for resource qmake_AxisHandling
[ 55%] Running rcc for resource qmake_AxisHandling_copy
[ 58%] Building CXX object CMakeFiles/axishandling.dir/axishandling_autogen/mocs_compilation.cpp.o
[ 61%] Building CXX object CMakeFiles/axishandling.dir/main.cpp.o
[ 64%] Building CXX object CMakeFiles/axishandling.dir/axishandling_qmltyperegistrations.cpp.o
[ 67%] Building CXX object CMakeFiles/axishandling.dir/.rcc/qrc_qmake_AxisHandling.cpp.o
[ 70%] Building CXX object CMakeFiles/axishandling.dir/.rcc/qrc_qmake_AxisHandling_copy.cpp.o
[ 73%] Building CXX object CMakeFiles/axishandling.dir/customformatter.cpp.o
[ 76%] Building CXX object CMakeFiles/axishandling.dir/.rcc/qmlcache/axishandling_qmlcache_loader.cpp.o
[ 79%] Building CXX object CMakeFiles/axishandling.dir/.rcc/qmlcache/axishandling_qml/axishandling/main_qml.cpp.o
[ 82%] Building CXX object CMakeFiles/axishandling.dir/.rcc/qmlcache/axishandling_qml/axishandling/Data_qml.cpp.o
[ 85%] Building CXX object CMakeFiles/axishandling.dir/.rcc/qmlcache/axishandling_qml/axishandling/AxisDragging_qml.cpp.o
[ 88%] Building CXX object CMakeFiles/axishandling.dir/.rcc/qmlcache/axishandling_qml/axishandling/AxisFormatting_qml.cpp.o
[ 91%] Building CXX object CMakeFiles/axishandling.dir/.rcc/qrc_axishandling_raw_qml_0.cpp.o
[ 94%] Linking CXX executable axishandling
[100%] Built target axishandling
Запустим:
./axishandling
qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.
Available platform plugins are: offscreen, wayland, eglfs, linuxfb, minimal, wayland-egl, vnc, minimalegl, xcb, vkkhrdisplay.
Aborted (образ памяти сброшен на диск)
Что то пошло не так!
Решение проблем с запуском программ написанных с использованием фреймворка Qt6
Единственная причина подобной ошибки - нехватка библиотек для запуска программы.
Запустим
ldd ./axishandling | grep not
Команда вернула пустой результат, это значит что все библиотеки для запуска самой программы присутствуют в системе.
Строка:
qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.
Говорит нам, что плагин xcb найден, но по какой-то причине не был запущен, давайте проверим и его:
ldd /usr/local/qt660/plugins/platforms/libqxcb.so | grep not
libxcb-cursor.so.0 => not found
libxcb-cursor.so.0 => not found
На этот раз у нас есть подозреваемый это библиотека
libxcb-cursor
Я специально не стал её включать в самом начале статьи, чтобы продемонстрировать как найти недостающие в системе библиотеки. Давайте установим libxcb-cursor:
su
dnf install xcb-util-cursor-devel
Последняя проверка окончания срока действия метаданных: 0:34:05 назад, Пн 22 янв 2024 07:56:38.
Зависимости разрешены.
=============================================================================================================================================================================================================================================
Пакет Архитектура Версия Репозиторий Размер
=============================================================================================================================================================================================================================================
Установка:
xcb-util-cursor-devel x86_64 0.1.3-6.el7 base 10 k
Установка зависимостей:
xcb-util-cursor x86_64 0.1.3-6.el7 base 18 k
xcb-util-image-devel x86_64 0.4.0-4.el7 base 16 k
xcb-util-renderutil-devel x86_64 0.3.9-5.el7 base 9.4 k
Результат транзакции
=============================================================================================================================================================================================================================================
Установка 4 Пакета
Проверим еще раз:
./axishandling
Обратите внимание, при попытке запуска программы с графическим интерфейсом по протоколу SSH вы получите ошибку:
./axishandling
qt.qpa.xcb: could not connect to display
Вы должны запускать программу из графической оболочки РЕДОС Linux!
На этот раз программа без проблем запуститься:
Программа корректно собрана и запускается!
Qt 6.6.0 успешно установлен в РЕДОС Linux!
Заключение
Сегодня мы рассмотрели установку Qt 6.6.0 из официального зеркала Qt Company Ltd.:
Установили необходимые для разработки пакеты;
Написали скрипт для загрузки всех необходимых файлов;
Скопировали архивы из папок в одно место;
Распаковали содержимое архивов;
Очистили временные папки и файлы;
Установили фреймворк в /usr/local/qt660;
Приписали пути к исполняемым файлам и библиотекам QT 6.6.0 в переменных при загрузке системы;
Загрузили, собрали и запустили проект из примеров Qt.
Добавить комментарий