我正在尝试为我的RPI编译Qt 5库,但它总是崩溃。
这些是我试图遵循的指南:
http://qt-project.org/wiki/RaspberryPi_Beginners_guide
http://qt-project.org/wiki/RaspberryPi
我已根据指南下载了交叉编译器和sysroot-image,并从git repo中提取了Qt5源代码。
按照其中一个指南后,我现在卡在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
答案 0 :(得分:11)
修复sysroot中库的路径。有些库是绝对路径的符号链接,在放入系统时会被破坏。检查/home/esa/qtonpi/rpi_image/usr/lib/arm-linux-gnueabihf/libdl.so或类似内容。你应该看到那些破坏的符号链接到绝对路径。修复所有这些。在您报告的文档中,提供了用于此目的的脚本。你有没有运行它(https://gitorious.org/cross-compile-tools/cross-compile-tools/blobs/master/fixQualifiedLibraryPaths)?
如果您仍然遇到麻烦,请尝试检查this:我写了一些注释,从git编译最新版本的喘息图像。
答案 1 :(得分:2)
对于那些尝试过现有答案并且不起作用的人的答案:
您下载的Raspbian图像可能不包含/usr/lib/
文件夹中libdl和libdm的符号链接。
在这种情况下,fixQualifiedLibraryPaths将无法帮助您,因为它无法找到符号链接。复制libdl.so
和libm.so
也可能会失败,例如,如果您使用闪存驱动器从现有的Raspberry Pi复制数据,它不会将它们复制为符号链接,但会自行复制库。但是,为了使构建成功,它似乎需要符号链接。
我查看了我的Raspberry Pi点的libdl
文件夹中的libdm
和/usr/lib/
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卡的图像安装在PC上(如in the guide所述),但这还不够:你必须先安装它 开始Qt Creator)
答案 2 :(得分:2)
试试这个
ln -s /mnt/raspberry-rootfs/lib/arm-linux-gnueabihf /lib/
基本上,当Pi
上的文件被链接(/lib/)
时,似乎已经指定了绝对路径,因此在/mnt/raspberry-rootfs
中它们已被破坏。
将Pi的/lib/arm-linux-gnueabihf
链接到Pc' /lib
目录可修复错误的链接并允许QT编译。这是一个肮脏的伎俩,但它确实有效。
如果您libdl/ libm
上没有Pi
,那么您需要将SD卡重新插入Pi
,然后启动并安装它们。显然,您需要在SD卡上通过SD卡创建新图像并将其安装在/mnt/raspberry-rootfs
答案 3 :(得分:1)
这可能是因为您的本地libdl.so
目录中缺少libm.so
和rootfs/usr/lib/arm-linux-gnueabihf
(只有libdl.a
和libm.a
)。从Raspberry Pi复制这两个文件应该使编译成功。
答案 4 :(得分:1)
而不是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