3

*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

これは、make プロセスの約 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を再インストールすることだけでした。確かにエレガントなソリューションではありませんが、私にとってはうまくいきます。

4

2 に答える 2

7

少し遅れましたが、問題/解決策を見つけました:

問題はsysrootです。通常、gcc は共有ライブラリにリンクします。しかし、それが見つからない場合、gcc はスタティック ライブラリ (.a) を使用します。[sysroot]/usr/lib/arm-linux-gnueabihf共有ライブラリを見ると、この場所にはありません。へのシンボリックリンクのみがあります/lib/arm-linux-gnueabihf。そのため、gcc はホスト 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
于 2014-09-25T09:52:42.270 に答える
1

libm.a(mpa.o): 共有オブジェクトを作成する場合、「ローカル シンボル」に対する再配置 R_ARM_THM_MOVW_ABS_NC は使用できません

-fPIC翻訳:コンパイルされていないオブジェクト ファイル ( mpa.ofrom libm.a) を共有ライブラリにリンクしようとしています。そんなことはできません。

ターゲットを見つけてインストールするかlibm.so、共有ライブラリをビルドしないようにqt5を構成する必要があります(おそらく--disable-sharedオプションを使用)。

于 2013-11-11T03:28:55.727 に答える