为Nitrogen6x构建Qt 5时出现Libm重定位错误

时间:2013-11-10 20:08:20

标签: qt build arm debian libc

我正在尝试在由* i.MX6Q`驱动的 Nitrogen6x主板上构建Qt 5。

我在主板上安装了 Debian / wheezy ,并使用 Ubuntu 12.10 机进行交叉编译。

配置Qt就像魅力一样,但我陷入了制作步骤。 这是我运行的配置脚本:

./configure -v -opensource -confirm-license  -reduce-relocations -no-pch -no-xcb -no-opengl -opengl es2  -qt-libpng -qt-zlib -qt-xkbcommon -qt-xcb -qt-pcre -qt-libjpeg -qt-sql-mysql -optimized-qmake\
   -make libs -device imx6 \
   -compile-examples   \
   -device-option CROSS_COMPILE=/home/finn/gcc-linaro-arm-linux-gnueabihf-4.8-2013.10_linux/bin/arm-linux-gnueabi- \
   -sysroot /media/finn/d72e3b65-b529-4e5c-9d30-872e1b0c9973 \
   -prefix /opt/qt5

这是我在制作过程中大约5分钟收到的错误:

/home/finn/gcc-linaro-arm-linux-gnueabihf-4.8-2013.10_linux/bin/../lib/gcc/arm-linux-gnueabihf/4.8.2/../../../../arm-linux-gnueabihf/bin/ld: 
/media/finn/d72e3b65-b529-4e5c-9d30-872e1b0c9973/usr/lib/libm.a(mpa.o): relocation R_ARM_THM_MOVW_ABS_NC against `a local symbol' can not be used when making a shared object; recompile with -fPIC
/media/finn/d72e3b65-b529-4e5c-9d30-872e1b0c9973/usr/lib/libm.a: could not read symbols: Bad value
collect2: error: ld returned 1 exit status

我之前遇到过同样的错误,当它试图访问libz.a但是在configure命令中添加qt-zlib参数修复了这个问题。

许多文章都说应该重新编译受影响的应用程序/库,但我不认为这是可能的,因为libm是libc6的一部分。

我已尝试使用aptitude remove libc6-dev zlib1g-dev g++-4.6重新安装它 和apt-get install gcc g++ make flex bison openssl libssl-dev perl perl-base perl-modules libperl-dev build-essential

可悲的是,这并没有解决问题。

使用官方网络安装程序安装Debian,以及董事会制造商Boundarydevices提供的内核和覆盖。

有没有人知道如何解决这个问题?

我的下一步是安装一个全新的Debian系统,但我真的想避免这种情况。

修改

使用-static选项编译qtbase对我来说很有用,但是在make步骤中尝试构建qtdeclarative时遇到了这个错误:

    /home/finn/gcc-linaro-arm-linux-gnueabihf-4.8-2013.10_linux/bin/../lib/gcc/arm-linux-gnueabihf/4.8.2/../../../../arm-linux-gnueabihf/bin/ld: cannot find crt1.o: No such file or directory
/home/finn/gcc-linaro-arm-linux-gnueabihf-4.8-2013.10_linux/bin/../lib/gcc/arm-linux-gnueabihf/4.8.2/../../../../arm-linux-gnueabihf/bin/ld: cannot find crti.o: No such file or directory
/home/finn/qt/qtbase/lib/libQt5Core.a(qlibrary_unix.o): In function `QLibraryPrivate::load_sys()':
qlibrary_unix.cpp:(.text+0xaac): warning: Using 'dlopen' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
/home/finn/gcc-linaro-arm-linux-gnueabihf-4.8-2013.10_linux/bin/../lib/gcc/arm-linux-gnueabihf/4.8.2/../../../../arm-linux-gnueabihf/bin/ld: cannot find -lqxcb
/home/finn/gcc-linaro-arm-linux-gnueabihf-4.8-2013.10_linux/bin/../lib/gcc/arm-linux-gnueabihf/4.8.2/../../../../arm-linux-gnueabihf/bin/ld: cannot find /lib/arm-linux-gnueabihf/libpthread.so.0
/home/finn/gcc-linaro-arm-linux-gnueabihf-4.8-2013.10_linux/bin/../lib/gcc/arm-linux-gnueabihf/4.8.2/../../../../arm-linux-gnueabihf/bin/ld: cannot find /usr/lib/arm-linux-gnueabihf/libpthread_nonshared.a
collect2: error: ld returned 1 exit status

编辑2 - 解决方案

我修复了问题并成功编译了Qt。 我需要做的就是重新安装Ubuntu。它肯定不是一个优雅的解决方案,但它适用于我。

2 个答案:

答案 0 :(得分:6)

迟到了,但我找到了问题/解决方案:

问题是 sysroot 。通常gcc链接到共享库。但是当它无法找到它时,gcc使用静态库(.a)。查看[sysroot]/usr/lib/arm-linux-gnueabihf时,共享库不在此处。 /lib/arm-linux-gnueabihf只有符号链接。所以gcc在你的host-pc上寻找共享库,在那里找不到它们。

解决方案

创建恰当的符号链接。 (这里是libglib的一个例子,X是版本号)

ln -s [sysroot]/lib/arm-linux-gnueabihf/libglib.so.X \
      [sysroot]/usr/lib/arm-linux-gnueabihf/libglib.so

(别忘了删除旧的符号链接并在编译成功后创建它;我只是在编译之前执行以下操作:

mv file.so file.so.backup

另一种解决方案

另一个解决方案是将绝对符号链接更改为相对符号。 例如,如果您的资料库是/lib/arm-linux-gnueabihf/libglib.so.X而且您需要/usr/lib/arm-linux-gnueabihf/中的链接,那么您只需执行以下操作:

ln -s ../../../lib/arm-linux-gnueabihf/libglib.so.X \
      [sysroot]/usr/lib/arm-linux-gnueabihf/libglib.so

答案 1 :(得分:1)

  

libm.a(mpa.o):在制作共享对象时不能使用针对“本地符号”的重定位R_ARM_THM_MOVW_ABS_NC

翻译:您正在尝试将非-fPIC编译对象文件(mpa.o)从libm.a)链接到共享库。你不能这样做。

您需要为目标查找/安装libm.so,或者将qt5配置为不构建共享库(可能使用--disable-shared选项)。