构建覆盆子pi的Qt库时出错

时间:2012-11-29 13:18:07

标签: qt compiler-errors makefile cross-compiling qt5

我正在尝试为我的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

5 个答案:

答案 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.solibm.so也可能会失败,例如,如果您使用闪存驱动器从现有的Raspberry Pi复制数据,它不会将它们复制为符号链接,但会自行复制库。但是,为了使构建成功,它似乎需要符号链接。

我查看了我的Raspberry Pi点的libdl文件夹中的libdm/usr/lib/

cd /usr/lib/arm-linux-gnueabihf/
ls -l libld.so libm.so

对找到的文件执行相同操作,直到它们不再是符号链接而是普通文件。

在我的系统上,结果发现它们被称为libdl-2.13.solibm-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.sorootfs/usr/lib/arm-linux-gnueabihf(只有libdl.alibm.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