Ошибка построения библиотек 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 ответов:
Исправьте пути библиотек в вашем корне системы. Некоторые библиотеки являются символическими ссылками на абсолютные пути, которые нарушаются при размещении в вашей системе. Проверьте что-нибудь вроде /home/esa/qtonpi/rpi_image/usr/lib/arm-linux-gnueabihf/libdl.so или подобное. Вы должны видеть, что это сломанные символические ссылки на абсолютные пути. Исправь все это. В сообщаемых вами документах для этого предусмотрен скрипт. Ты его запустил (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
с каталогом Pc/lib
исправляет неправильное связывание и позволяет QT компилироваться. Это грязный трюк, но он работает.Если у вас нет
libdl/ libm
наPi
, то вам нужно вставить SD-карту обратно вPi
, загрузиться и установить их. Очевидно, вам нужно будет создайте новый образ на ПК с SD-карты и установите его на/mnt/raspberry-rootfs
Ответ для тех, кто попробовал оба существующих ответа, и они не сработали:
Может случиться так, что загруженный образ Raspbian не содержит символьных ссылок для libdl и libdm в папке
/usr/lib/
.В этом случае fixQualifiedLibraryPaths не поможет вам, так как он не может найти символьные ссылки. Копирование
libdl.so
иlibm.so
также может завершиться неудачей, например, если вы используете флэш-накопитель для копирования данных из существующей Raspberry Pi, он не будет копировать их в виде символьных ссылок, но будет копировать сама библиотека. Однако для успешной сборки, по-видимому, требуются символьные ссылки.Я посмотрел на то, что
libdl
иlibdm
в папке/usr/lib/
моей Raspberry 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). Поэтому я создал символические ссылки для них в папке/usr/lib/arm-linux-gnueabihf/
: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-карты, установленной на вашем ПК (как описано в руководство ), но этого недостаточно: вы должны установить его раньше запуск Qt Creator)