【问题标题】:Libm relocation error when building Qt 5 for Nitrogen6x为 Nitrogen6x 构建 Qt 5 时出现 Libm 重定位错误
【发布时间】:2013-11-10 20:08:20
【问题描述】:

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

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

配置 Qt 就像一个魅力,但我被困在 make 步骤中。 这是我运行的配置脚本:

./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 但将 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 提供的内核和 Overlay 进行安装。

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

我的下一步是安装一个全新的 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。这肯定不是一个优雅的解决方案,但它对我有用。

【问题讨论】:

    标签: qt build arm debian libc


    【解决方案1】:

    有点晚了,但我找到了问题/解决方案:

    问题是 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
    

    【讨论】:

      【解决方案2】:

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

      翻译:您正在尝试将非-fPIC 编译的目标文件(mpa.o 来自libm.a)链接到共享库。你不能那样做。

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

      【讨论】:

      • 非常感谢您的回答。使用 -static 选项编译 qt 就可以了。 Qtbase 已经成功构建,并且 qtjsbackend 的工作方式也很吸引人,但是我在构建 qtdeclarative 时遇到了麻烦。编译器声称它找不到 crti.o、libpthread.so.0 和目标上存在的其他文件。我已经在我原来的问题中发布了错误消息。你知道如何解决这个问题吗?非常感谢!
      猜你喜欢
      • 1970-01-01
      • 2021-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多