Ошибка построения библиотек Qt для raspberry pi
Я пытаюсь скомпилировать библиотеки Qt 5 для моего RPI, но он всегда падает.
Это руководства, которым я пытался следовать:
http://qt-project.org/wiki/RaspberryPi_Beginners_guide
http://qt-project.org/wiki/RaspberryPi
Я загрузил кросс-компилятор и sysroot-образ в соответствии с руководством и вытащил источники Qt5 из репозитория git.
после следования одному из проводников я теперь застрял в make
.
Это ошибка, которую я получаю:
.obj/release-shared/qlibrary_unix.o: In function `QLibraryPrivate::load_sys()':
qlibrary_unix.cpp:(.text+0xf84): warning: Using 'dlopen' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
/home/esa/qtonpi/rpi_image/usr/lib/arm-linux-gnueabihf/libdl.a(dlopen.o): In function `dlopen':
(.text+0xc): undefined reference to `__dlopen'
/home/esa/qtonpi/rpi_image/usr/lib/arm-linux-gnueabihf/libdl.a(dlclose.o): In function `dlclose':
(.text+0x0): undefined reference to `__dlclose'
/home/esa/qtonpi/rpi_image/usr/lib/arm-linux-gnueabihf/libdl.a(dlsym.o): In function `dlsym':
(.text+0xc): undefined reference to `__dlsym'
/home/esa/qtonpi/rpi_image/usr/lib/arm-linux-gnueabihf/libdl.a(dlerror.o): In function `dlerror':
(.text+0x0): undefined reference to `__dlerror'
/home/esa/qtonpi/rpi_image/usr/lib/arm-linux-gnueabihf/libm.a(feholdexcpt.o): In function `feholdexcept':
(.text+0x48): undefined reference to `_dl_hwcap'
/home/esa/qtonpi/rpi_image/usr/lib/arm-linux-gnueabihf/libm.a(fesetenv.o): In function `fesetenv':
(.text+0x64): undefined reference to `_dl_hwcap'
collect2: virhe: ld:n paluuarvo oli 1 # collect2: error: ld returnvalue was 1
make[2]: *** [../../lib/libQt5Core.so.5.0.0] Virhe 1 # Error 1
make[2]: Poistutaan hakemistosta "/home/esa/qtonpi/qt5/qtbase/src/corelib" # Leaving directory
make[1]: *** [sub-corelib-make_first] Virhe 2 # Error 2
make[1]: Poistutaan hakemistosta "/home/esa/qtonpi/qt5/qtbase/src" # Leaving directory
make: *** [sub-src-make_first] Virhe 2 # Error 2
5 ответов
исправьте пути библиотек в вашем sysroot. Некоторые библиотеки являются символическими ссылками на абсолютные пути, которые нарушаются при размещении в вашей системе. Проверьте что-то вроде /home/esa/qtonpi/rpi_image/usr/lib/arm-linux-gnueabihf/libdl.так или иначе. Вы должны увидеть те символические ссылки с абсолютными путями. Исправь все это. В документах, о которых вы сообщили, предусмотрен скрипт для этой цели. Ты запустил его? (https://gitorious.org/cross-compile-tools/cross-compile-tools/blobs/master/fixQualifiedLibraryPaths)?
попробуйте также проверить этой Если вы все еще сталкиваетесь с проблемами: я записал некоторые заметки, компилирующие последнюю версию из git для wheezy image.
попробуй такое
ln -s /mnt/raspberry-rootfs/lib/arm-linux-gnueabihf /lib/
в основном кажется, что абсолютный путь(ы) были указаны, когда файлы so на Pi
связаны (/lib/)
, поэтому в /mnt/raspberry-rootfs
они сломаны.
связывание Pi /lib/arm-linux-gnueabihf
в ПК /lib
каталог исправляет неправильную связь и позволяет Qt компилировать. Это грязный трюк, но он работает.
если у вас нет libdl/ libm
на Pi
, то вам нужно вставить SD-карту обратно в Pi
загрузки и установить их. Очевидно, вам нужно будет создать новое изображение на ПК с SD-карты и установить его на /mnt/raspberry-rootfs
ответ для тех, кто пробовал оба существующих ответа, и они не работали:
может случиться так, что загруженное изображение Raspbian не содержит символических ссылок для libdl и libdm в .
в этом случае fixQualifiedLibraryPaths не поможет вам, поскольку он не может найти символические ссылки. Копирование libdl.so
и libm.so
может также произойти сбой, например, если вы используете флэш-накопитель для копирования данных из существующего Raspberry Pi, он не будет копировать их как символические ссылки, но будут копировать сами библиотеки. Однако для успешной сборки, похоже, требуются символические ссылки.
я посмотрел на то, что libdl
и libdm
на /usr/lib/
папка моей малины Pi точка на
cd /usr/lib/arm-linux-gnueabihf/
ls -l libld.so libm.so
сделайте то же самое для найденных файлов, пока они больше не будут символическими ссылками, а обычными файлами.
в моей системе оказалось, они называются libdl-2.13.so
и libm-2.13.so
и проживать в /lib/arm-linux-gnueabihf/
вместо /usr/lib/...
вернусь на мой компьютер я нашел эти точные файлы в /lib/arm-linux-gnueabihf/
папка (если вы не найдете их, вы можете скопировать их с Вашего Raspberry Pi). Поэтому я создал символические ссылки для них в :
sudo ln -s /lib/arm-linux-gnueabihf/libdl-2.13.so /usr/lib/arm-linux-gnueabihf/libdl.so
sudo ln -s /lib/arm-linux-gnueabihf/libm-2.13.so /usr/lib/arm-linux-gnueabihf/libm.so
после этого, qtbase был успешно скомпилирован.
(обратите внимание, что для продолжения кросс-компиляции из Qt вы должны держите изображение вашей SD-карты, установленной на вашем ПК (как описано in проводник!--33-->), но этого недостаточно: вы должны установите его перед запуск Qt Creator)
Это может быть потому что libdl.so
и libm.so
отсутствуют в вашем локальном rootfs/usr/lib/arm-linux-gnueabihf
каталог (есть только libdl.a
и libm.a
). Копирование двух файлов из Raspberry Pi должно сделать компиляцию успешной.
вместо fixQualifiedLibraryPaths используйте:
cd <folder-with-sysroot-subfolder>
wget https://raw.githubusercontent.com/riscv/riscv-poky/master/script/sysroot-relativelinks.py
chmod +x sysroot-relativelinks.py
./sysroot-relativelinks.py sysroot