我正试图为我的RPI编译Qt 5库,但它总是崩溃。
以下是我尝试遵循的指南:
http://qt-project.org/wiki/RaspberryPi_Beginners_guide
http://qt-project.org/wiki/RaspberryPi
我已经根据指南下载了交叉编译器和系统根映像,并从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
修复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)?
如果你仍然遇到麻烦,也试着检查一下:我写下了一些注释,为这个喘息的图像从git编译了一个最新版本。
对于那些尝试了两种现有答案但都不起作用的人的答案:
您下载的Raspbian映像可能在/usr/lib/
文件夹中不包含libdl和libdm的符号链接。
在这种情况下,fixQualifiedLibraryPaths对您没有帮助,因为它找不到符号链接。复制libdl.so
和libm.so
也可能失败,例如,如果您使用闪存驱动器从现有的Raspberry Pi复制数据,它不会将它们复制为符号链接,而是会复制库本身。然而,要使构建成功,似乎需要符号链接。
我在上查看了我的树莓派点的/usr/lib/
文件夹中的libdl
和libdm
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)
试试这个
ln -s /mnt/raspberry-rootfs/lib/arm-linux-gnueabihf /lib/
基本上,当Pi
上的so文件链接到(/lib/)
时,似乎已经指定了绝对路径,因此在/mnt/raspberry-rootfs
中它们被破坏。
将Pi的/lib/arm-linux-gnueabihf
链接到Pc的/lib
目录可以修复错误的链接,并允许QT进行编译。这是一个肮脏的把戏,但它奏效了。
如果Pi
上没有libdl/ libm
,则需要将SD卡插回Pi
,引导并安装它们。显然,您需要从SD卡在PC上创建一个新映像,并将其安装在/mnt/raspberry-rootfs
上
这可能是因为本地rootfs/usr/lib/arm-linux-gnueabihf
目录中缺少libdl.so
和libm.so
(只有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