кросскомпиляция qt и pyqt
Jun. 26th, 2016 08:53 pmпосмотреть
приёмы кросскомпиляции qt и pyqt
при кросскомпиляция qt5 добавить
и добавить опции сборки
для кросскомпиляции qt6 нужен qt в чруте
при сборке в чруте добавить опции
добавить опции сборки
кросскомпиляция pyqt
в pyqt 6.6.1
http://gitlab.tmispb/open-source/pyqt-builder/-/blob/master/pyqtbuild/bindings.py?ref_type=heads#L128
run_test = True заменить на False это отключит проверку собранных бинариков и pyqt соберётся
в pyqt 5.15.2
http://gitlab.tmispb/open-source/pyqt/-/blob/master/configure.py?ref_type=heads#L2445
заменить
error("%s failed to create %s. Make sure your Qt installation is correct." % (test, out_file))
на
with open(out_file, "w") as f: f.write("shared")
это отключит проверку собранных бинариков и pyqt соберётся
некоторые переменные sip
dpkg-architecture
DEB_BUILD_ARCH=arm64
DEB_BUILD_ARCH_ABI=base
DEB_BUILD_ARCH_BITS=64
DEB_BUILD_ARCH_CPU=arm64
DEB_BUILD_ARCH_ENDIAN=little
DEB_BUILD_ARCH_LIBC=gnu
DEB_BUILD_ARCH_OS=linux
DEB_BUILD_GNU_CPU=aarch64
DEB_BUILD_GNU_SYSTEM=linux-gnu
DEB_BUILD_GNU_TYPE=aarch64-linux-gnu
DEB_BUILD_MULTIARCH=aarch64-linux-gnu
DEB_HOST_ARCH=arm64
DEB_HOST_ARCH_ABI=base
DEB_HOST_ARCH_BITS=64
DEB_HOST_ARCH_CPU=arm64
DEB_HOST_ARCH_ENDIAN=little
DEB_HOST_ARCH_LIBC=gnu
DEB_HOST_ARCH_OS=linux
DEB_HOST_GNU_CPU=aarch64
DEB_HOST_GNU_SYSTEM=linux-gnu
DEB_HOST_GNU_TYPE=aarch64-linux-gnu
DEB_HOST_MULTIARCH=aarch64-linux-gnu
DEB_TARGET_ARCH=arm64
DEB_TARGET_ARCH_ABI=base
DEB_TARGET_ARCH_BITS=64
DEB_TARGET_ARCH_CPU=arm64
DEB_TARGET_ARCH_ENDIAN=little
DEB_TARGET_ARCH_LIBC=gnu
DEB_TARGET_ARCH_OS=linux
DEB_TARGET_GNU_CPU=aarch64
DEB_TARGET_GNU_SYSTEM=linux-gnu
DEB_TARGET_GNU_TYPE=aarch64-linux-gnu
DEB_TARGET_MULTIARCH=aarch64-linux-gnu
некоторые переменные QMAKE
https://doc.qt.io/qt-6/qmake-environment-reference.html
QMAKE_SPEC — короткое имя хоста mkspec, которое разрешено и сохранено вQMAKESPECпеременная во время сборки хоста
QMAKE_VERSION — текущая версия qmake
QMAKE_XSPEC — короткое имя цели mkspec, которое разрешено и сохранено вQMAKESPECпеременная во время целевой сборки
QT_HOST_BINS — расположение исполняемых файлов хоста.
QT_HOST_DATA — расположение данных для исполняемых файлов хоста, используемых qmake.
QT_HOST_LIBS — расположение хост-библиотек
QT_HOST_LIBEXECS — расположение исполняемых файлов, необходимых хост-библиотекам во время выполнения.
QT_HOST_PREFIX — префикс по умолчанию для всех путей хоста
QT_INSTALL_ARCHDATA — расположение общих данных Qt, зависящих от архитектуры.
QT_INSTALL_BINS — расположение бинарных файлов Qt (инструментов и приложений)
QT_INSTALL_CONFIGURATION — расположение настроек Qt. Не применимо в Windows
QT_INSTALL_DATA — расположение общих данных Qt, не зависящих от архитектуры.
QT_INSTALL_DOCS — расположение документации
QT_INSTALL_EXAMPLES — расположение примеров
QT_INSTALL_HEADERS — расположение всех заголовочных файлов.
QT_INSTALL_LIBEXECS — расположение исполняемых файлов, необходимых библиотекам во время выполнения.
QT_INSTALL_LIBS — расположение библиотек
QT_INSTALL_PLUGINS — расположение плагинов Qt
QT_INSTALL_PREFIX — префикс по умолчанию для всех путей
QT_INSTALL_QML — расположение расширений QML 2.x.
QT_INSTALL_TESTS — расположение тестовых примеров Qt
QT_INSTALL_TRANSLATIONS — расположение информации о переводе строк Qt.
QT_SYSROOT — системный корень, используемый целевой средой сборки.
-DBUILD_qtmultimedia=OFF \ - отключить сборку qtmultimedia, также как configure --skip qtmultimedia
https://src.fedoraproject.org/rpms/qt6-qtbase/blob/rawhide/f/qt6-qtbase.spec
-DQT_QMAKE_TARGET_MKSPEC=%{platform}
https://lists.debian.org/debian-qt-kde/2022/04/msg00365.html
-DQT_HOST_PATH=/usr/lib/qt6
https://martchus.no-ip.biz/doc/qt6/qtcmake/cmake-variable-reference.html
QT_HOST_PATH Местоположение установки хоста Qt, из которого можно использовать инструменты хоста во время другой сборки Qt, обычной или кросс-компиляции.
QT_FORCE_BUILD_TOOLS Принудительно создает инструменты, даже если основные инструменты уже найдены. Полезно при кросс-компиляции Qt, чтобы обеспечить наличие в SDK кросс-компилируемых инструментов.
QT_FORCE_FIND_TOOLS Использует инструменты Qt из предварительно встроенного Qt, QT_HOST_PATHкогда вы не выполняете кросс-компиляцию. Переменная вступает в силу только в том случае, если QT_FORCE_BUILD_TOOLSей присвоено значение ON. В противном случае QT_FORCE_FIND_TOOLS это не влияет на поведение по умолчанию.
некоторые переменные CMAKE
https://cmake.org/cmake/help/latest/manual/cmake-variables.7.html
https://man.archlinux.org/man/extra/cmake/cmake-variables.7.en
https://jeremimucha.com/2021/02/cmake-variable-guidelines/
CMAKE_HOST_SYSTEM_PROCESSOR - Имя процессора, на котором работает CMake, uname -m
CMAKE_SYSTEM_PROCESSOR - следует установить переменную в соответствии с целевой архитектурой, которую она указывает
CMAKE_SYSTEM_PROCESSOR=aarch64
CMAKE_PROJECT_NAME – имя, указанное при самом первом вызове проекта.
CMAKE_PROJECT_VERSION – строка полной версии, указанная при самом первом вызове проекта.
CMAKE_PROJECT_VERSION_MAJOR – основной компонент строки версии, передаваемой при самом первом вызове проекта.
CMAKE_PROJECT_VERSION_MINOR – младший компонент строки версии, передаваемой при самом первом вызове проекта.
CMAKE_PROJECT_VERSION_PATCH – компонент исправления строки версии, указанный при самом первом вызове проекта.
PROJECT_NAME – имя, присвоенное последнему вызову проекта.
PROJECT_SOURCE_DIR – каталог последнего вызова проекта.
PROJECT_BINARY_DIR – каталог сборки, соответствующий исходному каталогу самого последнего вызова проекта.
PROJECT_VERSION – строка полной версии, указанная для самого последнего вызова проекта.
PROJECT_VERSION_MAJOR – основной компонент строки версии, указанной при последнем вызове проекта.
PROJECT_VERSION_MINOR – младший компонент строки версии, указанной при последнем вызове проекта.
PROJECT_VERSION_PATCH – компонент исправления строки версии, указанной для самого последнего вызова проекта.
CMAKE_SYSROOT
CMAKE_STAGING_PREFIX - В этой переменной может быть указан путь для установки при кросс-компиляции
CMAKE_PREFIX_PATH - Список каталогов, разделенных точкой с запятой, определяющий установочные префиксы , в которых будет выполняться поиск
https://discourse.cmake.org/t/cmake-staging-prefix-vs-cmake-install-prefix/6485
параметр CMAKE_STAGING_PREFIX не должен устанавливаться проектом, он предназначен для разработчика. В сценариях кросс-компиляции разработчик может смонтировать файловую систему целевого компьютера в файловую систему своего хоста. Возможно, они захотят установить непосредственно в эту смонтированную файловую систему. На хосте путь к базовой точке установки может быть /mnt/raspi/opt/mything, тогда как на целевом компьютере тот же путь будет находиться под /opt/mything. В этом примере вы должны CMAKE_INSTALL_PREFIX установить /opt/mything и CMAKE_STAGING_PREFIX./mnt/raspi/opt/mything
некоторые переменные automake
https://gcc.gnu.org/onlinedocs/gcc/
https://gcc.gnu.org/onlinedocs/gccint/index.html
https://www.protokols.ru/WP/gnu-automake/
CC_FOR_BUILD - на которой собирается
CC_FOR_HOST - для которой собирается
CC_FOR_TARGET - для которой GCC будет создавать код
--build: машина, на которой вы собираете
--host: машина, для которой вы собираете
--target: машина, для которой GCC будет создавать код; флаг --target=TARGET для указания сборки GCC как кросс-компилятора для TARGET
кросскомпиляция
make CC=cross-gcc HOST_CC=gcc
CMAKE_HOST_SYSTEM_PROCESSOR - Имя процессора, на котором работает CMake, uname -m
CMAKE_SYSTEM_PROCESSOR - следует установить переменную в соответствии с целевой архитектурой, которую она указывает
CMAKE_SYSTEM_PROCESSOR=aarch64
В autoconf используется следующая терминология:
build - это система, на которой вы компилируете.
хост — это система, на которой будет работать то, что вы создаете.
target — это то, для чего будет компилироваться создаваемый вами компилятор, и не имеет значения, если компилятор не создается.
Однако в других инструментах, например ptxdist, используется следующая терминология:
хост - это система, на которой вы строите.
цель — это система, на которой будет работать то, что вы создаете.
Таким образом, в зависимости от того, какой инструмент у вас есть, хост означает разные вещи.
Добавляет префикс PREFIX к именам устанавливаемых программ.
--program-prefix=PREFIX
Добавляет суффикс SUFFIX к именам устанавливаемых программ.
--program-suffix=SUFFIX
Запускает команду sed PROGRAM для имен установленных программ.
--program-transform-name=PROGRAM
Не отключать медленное отслеживание зависимостей
–enable-dependency-tracking
Опции, поддерживаемые всеми включенными пакетами можно увидеть по команде configure –help=recursive
Makefile.am — это файл , определяемый программистом, который используется automakeдля создания Makefile.in файла ( .am обозначает автоматическую настройку )
make install может считаться комбинацией make install-exec install-data
install-exec для зависимых от архитектуры файлов и install-data – для остальных
make distcheck
ldconfig библиотеки
ликбез
/opt/mylib/libmy.so
gcc main.o -L/opt/mylib -lmy -lm -o my.out
Параметр -L/opt/mylib сообщает компилятору gcc , что каталог /opt/mylib входит в число тех мест, в которых можно найти статические и разделяемые библиотеки. По умолчанию компоновщик ищет библиотечные файлы в традиционных каталогах, таких как /usr/lib или /usr/local/lib.
Если не указать параметр -L, то компоновщик выполнит поиск только по этим стандартным путям.
Параметр -lmy говорит компилятору gcc, что ему нужно искать файл libmy.a или libmy.so.
Расширение принадлежит разделяемым библиотекам, о которых мы поговорим в следующем разделе.
Обратите внимание на то, по какому принципу выбирается имя. Если, к примеру, передать параметр -lxyz, то компоновщик будет искать в заданных и стандартных каталогах файл libxyz.a или libxyz.so
Параметр -lm сообщает компилятору gcc, что нужно искать еще одну библиотеку с именем libm.a или libm.so.
Параметр -o my.out говорит компилятору gcc, что итоговый исполняемый файл должен называться my.out
Параметр, -fPIC обязателен, если вам нужно создать динамическую библиотеку из набора переносимых объектных файлов
Флаг -static заставляет компоновщик принимать только статические библиотеки, а не общие библиотеки
Параметр -shared нужен чтобы компилятор создал разделяемый объектный файл из переносимых
Для статического связывания необходимо, чтобы в системе существовали архивные версии библиотек .a
разделяемые объектные файлы имеют расширение .so
export LD_LIBRARY_PATH=/opt/mylib - добавить к стандартным поисковым путям каталог /opt/mylib чтобы загрузчик нашел разделяемый объектный файл, а динамический компоновщик загрузил из данного файла все необходимые символы
ar crs libmy.a my1.o my2.o my3.o - архивация переносимых объектных файлов в статическую библиотеку
ar t libmy.a - вывод содержимого статической библиотеки
readelf -s my1.out - Таблица символов исполняемого объектного файла
readelf -hSl my1.out - Содержимое исполняемого объектного файла
objdump -d my1.out - просмотра ассемблерного кода
nm my1.out - Вывод символов, определенных в файле
AST - Дерево абстрактного синтаксиса
clang -c -Xclang -ast-dump filename.c - вывести дерево абстрактного синтаксиса
ldconfig
/lib/ld.so динамический компановщик
/etc/ld.so.conf Файл, содержащий список разделённых двоеточием, пробелом, табуляцией или символом новой строки, каталогов, в которых производится поиск библиотек.
/etc/ld.so.cache Файл, содержащий сортированный список библиотек, найденных в каталогах, заданных в /etc/ld.so.conf.
вызов ldconfig без параметров создаёт /etc/ld.so.cache
https://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html#AEN77
https://stackoverflow.com/questions/13428910/how-to-set-the-environmental-variable-ld-library-path-in-linux
LD_LIBRARY_PATH -это предопределенная переменная среды в Linux/Unix, которая задает путь, который компоновщик должен искать при связывании динамических библиотек/общих библиотек.
LD_LIBRARY_PATH содержит разделенный двоеточием список путей, и компоновщик придает этим путям приоритет над стандартными библиотечными путями /lib и /usr/lib . Стандартные пути все равно будут найдены, но только после того, как список путей в LD_LIBRARY_PATH будет исчерпан.
Лучший способ использовать LD_LIBRARY_PATH -это установить его в командной строке или скрипте непосредственно перед выполнением программы. Таким образом, новый LD_LIBRARY_PATH изолирован от rest вашей системы.
export LD_LIBRARY_PATH="/list/of/library/paths:/another/path"
или находясь в той же папке выполнить команду LD_LIBRARY_PATH=. ./service
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/your/custom/path/
echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/your/custom/path/' >> ~/.bashrc
/lib/ld-linux.so.2 --library-path PATH EXECUTABLE
Перейдите в домашнюю папку и отредактируйте .profile Поместите следующую строку в конец
export LD_LIBRARY_PATH=
Сохранить и выйти.Выполните эту команду
sudo ldconfig
sudo vi /etc/bash.bashrc
прокрутите вниз и добавьте:
export LD_LIBRARY_PATH=.
У всех пользователей добавлена переменная среды
ещё вариант
/etc/profile.d.
cd /etc/profile.d
sudo touch myenv_vars.sh
sudo nano myenv_vars.sh
Добавьте это в пустой файл и сохраните.
export LD_LIBRARY_PATH=/usr/local/lib
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/taylor
sudo ldconfig
g++ -L/home/user/myDir -lxyz myprog.cpp -o myprog
Опция -l (в нижнем регистре L) указывает имя библиотеки, а не путь.
Чтобы добавить путь для поиска библиотек, используйте опцию -L
Утилиты для работы с объектными файлами
ar
создаёт статические библиотеки.
objdump
может быть использована для показа всей информации о бинарном объектном файле.
strings
показывает все строковые данные в бинарном файле, содержащие печатные символы.
nm
перечислить символы, определённые в символьной таблице объектного файла.
ldd
перечислить динамические библиотеки, от которых зависит объектный файл.
strip
удалить информацию из таблицы символов.
получить список путей поиска по умолчанию
cpp -v
$(gcc -print-prog-name=cc1) -v
echo | gcc -Wp,-v -x c++ - -fsyntax-only
gcc -xc -E -v -
gcc -xc++ -E -v -
cpp -v /dev/null -o /dev/null
gcc -v -x c -E /dev/null
ссылки
https://github.com/qt
https://download.qt.io/official_releases/qt/
https://riverbankcomputing.com/pypi/simple/
https://pypi.org/project/PyQt6
https://pypi.org/project/PyQt5
https://www.qt.io/blog/qt-6-build-system
https://wiki.qt.io/Cross-Compile_Qt_6_for_Raspberry_Pi
https://wiki.qt.io/Cross-compiling_Qt_6.5_for_both_armhf_and_aarch64_architectures_for_Raspberry_Pi_OS
https://doc.qt.io/qt-6/configure-linux-device.html
https://spec-zone.ru/qt~6.0/configure-linux-device
https://doc.qt.io/qt-6/cmake-variable-qt-host-path.html
https://embeddeduse.com/2022/04/11/building-qt-6-2-for-old-yocto-versions/
https://src.fedoraproject.org/rpms/qt6-qtbase/blob/rawhide/f/qt6-qtbase.spec
https://marssola.github.io/dev/2021/07/22/qt5-qt6-cross-compiled-part3.html
https://github.com/kevin-strobel/qt6pi3b/blob/master/toolchain.cmake
https://jeremimucha.com/2021/02/cmake-variable-guidelines/
https://doc.embedfire.com/linux/rk356x/Qt/zh/latest/lubancat_qt/install/install_arm_3.html
https://git.alpinelinux.org/aports/tree/community/qt6-qtbase/APKBUILD
https://discourse.llvm.org/t/simple-cross-compilation-with-target-fails/65948/7
https://github.com/PhysicsX/QTonRaspberryPi/blob/main/QtRaspberryPi6.6.1/README.md
https://doc.bccnsoft.com/docs/PyQt5/installation.html
https://gitlab.com/dboddie/pyqt5-for-embedded-linux/-/blob/master/build.sh?ref_type=heads


