aarch64-linux-gnu交叉編譯Qt4.7.3

到 Qt 官網下載合適的 Qt 版本,地址:http://download.qt-project.org/archive/qt/

1.環境搭建:
1.安裝automake、libtool 和主機上的 Qt 工具:

$ sudo apt-get install automake autoconf libtool m4
$ sudo apt-get install libX11-dev libXext-dev libXtst-dev libXrender-dev
$ sudo apt-get install libqt4-core libqt4-dev libqt4-webkit qt4-demos
2.搭建交叉編譯環境:
環境搭建很簡單,只要把交叉編譯工具鏈解壓後,在/etc/profile文件最後一行處添加環境變量,系統啓動時會自動設置。

解壓後進入目錄,ls bin/可以看到aarch64-linux-gnu-gcc、aarch64-linux-gnu-g++等編譯器。

複製代碼
[~/qtArm64Toolchain/Ambarella_Linaro_Toolchain_2016.02_For_S5/linaro-aarch64-2016.02-gcc5.3 root@jz4775dev]
[root@jz4775dev]# ls
aarch64-linux-gnu bin include lib lib64 libexec share
[~/qtArm64Toolchain/Ambarella_Linaro_Toolchain_2016.02_For_S5/linaro-aarch64-2016.02-gcc5.3 root@jz4775dev]
[root@jz4775dev]# ls bin/
aarch64-linux-gnu-addr2line aarch64-linux-gnu-cpp aarch64-linux-gnu-gcc-ar aarch64-linux-gnu-gdb aarch64-linux-gnu-objcopy aarch64-linux-gnu-readelf
aarch64-linux-gnu-ar aarch64-linux-gnu-elfedit aarch64-linux-gnu-gcc-nm aarch64-linux-gnu-gprof aarch64-linux-gnu-objdump aarch64-linux-gnu-size
aarch64-linux-gnu-as aarch64-linux-gnu-g++ aarch64-linux-gnu-gcc-ranlib aarch64-linux-gnu-ld aarch64-linux-gnu-pkg-config aarch64-linux-gnu-strings
aarch64-linux-gnu-c++ aarch64-linux-gnu-gcc aarch64-linux-gnu-gcov aarch64-linux-gnu-ld.bfd aarch64-linux-gnu-pkg-config-real aarch64-linux-gnu-strip
aarch64-linux-gnu-c++filt aarch64-linux-gnu-gcc-5.3.1 aarch64-linux-gnu-gcov-tool aarch64-linux-gnu-nm aarch64-linux-gnu-ranlib 
複製代碼
[root@jz4775dev]# vim /etc/profile
在最後一行添加:

export PATH=/root/qtArm64Toolchain/Ambarella_Linaro_Toolchain_2016.02_For_S5/linaro-aarch64-2016.02-gcc5.3/bin:$PATH

2.編譯安裝Qt4.7.3
把qt-everywhere-opensource-src-4.7.3.tar.gz拷貝到/opt 目錄下,使用下面command解壓:

tar -xvf qt-everywhere-opensource-src-4.7.3.tar.gz

並在/opt目錄下新建目錄qt-4.7.3-arm64(qt-4.7.3-arm64是編譯完成後的安裝目錄):

mkdir qt-4.7.3-arm64
然後進入qt-everywhere-opensource-src-4.7.3目錄:
a.修改mkspecs/qws/linux-arm-gnueabi-g++/qmake.conf文件如下:

複製代碼
1 #
2 # qmake configuration for building with arm-none-linux-gnueabi-g++
3 #
4
5 include(…/…/common/g++.conf)
6 include(…/…/common/linux.conf)
7 include(…/…/common/qws.conf)
8
9 # modifications to g++.conf
10 QMAKE_CC = aarch64-linux-gnu-gcc
11 QMAKE_CXX = aarch64-linux-gnu-g++
12 QMAKE_LINK = aarch64-linux-gnu-g++
13 QMAKE_LINK_SHLIB = aarch64-linux-gnu-g++
14
15 # modifications to linux.conf
16 QMAKE_AR = aarch64-linux-gnu-ar cqs
17 QMAKE_OBJCOPY = aarch64-linux-gnu-objcopy
18 QMAKE_STRIP = aarch64-linux-gnu-strip
19
20 load(qt_config)
複製代碼

b.執行configure生成Makefile文件,命令如下:

複製代碼
./configure -opensource -prefix /opt/qt-4.7.3-arm64 -xplatform qws/linux-arm-gnueabi-g++ -embedded armv8 -release -webkit -no-cups -qt-zlib -qt-libjpeg -qt-libmng -qt-libpng -depths all -qt-gfx-linuxfb -qt-g
fx-transformed -no-gfx-qvfb -qt-gfx-vnc -qt-gfx-multiscreen -qt-kbd-tty -no-openssl -no-phonon -no-phonon-backend -no-nas-sound -no-exceptions -svg -no-qt3support -no-multimedia -no-xmlpatterns -no-pch -con
firm-license
複製代碼

配置成功顯示如下:

複製代碼
NOTICE: Atomic operations are not yet supported for this
architecture.

    Qt will use the 'generic' architecture instead, which uses a
    single pthread_mutex_t to protect all atomic operations. This
    implementation is the slow (but safe) fallback implementation
    for architectures Qt does not yet support.

Qt is now configured for building. Just run ‘make’.
Once everything is built, you must run ‘make install’.
Qt will be installed into /opt/qt-4.7.3-arm64

To reconfigure, run ‘make confclean’ and ‘configure’.
複製代碼

然後:

make

注意:

  1. qt4.7.3 configure時要加上-embedded armv8參數,armv8是arm芯片的架構(arm9對應armv5,arm11對應armv6,cortex-a8和cortex-a9對應armv7),不然會出現以下情況:

複製代碼
You have not explicitly asked to use pkg-config and are cross-compiling.
pkg-config will not be used to automatically query cflag/lib parameters for
dependencies

This is the Qt for Linux/X11 Open Source Edition.

You are licensed to use this software under the terms of
the Lesser GNU General Public License (LGPL) versions 2.1.
You are also licensed to use this software under the terms of
the GNU General Public License (GPL) versions 3.

You have already accepted the terms of the license.

Creating qmake. Please wait…
g++ -c -o option.o -m64 -pipe -DQMAKE_OPENSOURCE_EDITION -I. -Igenerators -Igenerators/unix -Igenerators/win32 -Igenerators/mac -Igenerators/symbian -I/opt/qt-everywhere-opensource-src-4.7.3/include -I/opt/qt-everywhere-opensource-src-4.7.3/include/QtCore -I/opt/qt-everywhere-opensource-src-4.7.3/src/corelib/global -I/opt/qt-everywhere-opensource-src-4.7.3/src/corelib/xml -I/opt/qt-everywhere-opensource-src-4.7.3/tools/shared -DQT_NO_PCRE -DQT_BUILD_QMAKE -DQT_BOOTSTRAPPED -DQLIBRARYINFO_EPOCROOT -DQT_NO_TEXTCODEC -DQT_NO_UNICODETABLES -DQT_NO_COMPONENT -DQT_NO_STL -DQT_NO_COMPRESS -I/opt/qt-everywhere-opensource-src-4.7.3/mkspecs/linux-g+±64 -DHAVE_QCONFIG_CPP -DQT_NO_THREAD -DQT_NO_QOBJECT -DQT_NO_GEOM_VARIANT option.cpp
g++ -o “/opt/qt-everywhere-opensource-src-4.7.3/bin/qmake” project.o property.o main.o makefile.o unixmake2.o unixmake.o mingw_make.o option.o winmakefile.o projectgenerator.o meta.o makefiledeps.o metamakefile.o xmloutput.o pbuilder_pbx.o borland_bmake.o msvc_vcproj.o msvc_vcxproj.o msvc_nmake.o msvc_objectmodel.o msbuild_objectmodel.o symmake.o initprojectdeploy_symbian.o symmake_abld.o symmake_sbsv2.o symbiancommon.o registry.o epocroot.o qtextcodec.o qutfcodec.o qstring.o qtextstream.o qiodevice.o qmalloc.o qglobal.o qbytearray.o qbytearraymatcher.o qdatastream.o qbuffer.o qlist.o qfile.o qfsfileengine_unix.o qfsfileengine_iterator_unix.o qfsfileengine.o qfsfileengine_iterator.o qregexp.o qvector.o qbitarray.o qdir.o qdiriterator.o quuid.o qhash.o qfileinfo.o qdatetime.o qstringlist.o qabstractfileengine.o qtemporaryfile.o qmap.o qmetatype.o qsettings.o qlibraryinfo.o qvariant.o qvsnprintf.o qlocale.o qlinkedlist.o qurl.o qnumeric.o qcryptographichash.o qxmlstream.o qxmlutils.o -m64
Basic XLib functionality test failed!
You might need to modify the include and library search paths by editing
QMAKE_INCDIR_X11 and QMAKE_LIBDIR_X11 in /opt/qt-everywhere-opensource-src-4.7.3/mkspecs/qws/linux-arm-gnueabi-g++.
複製代碼

2.執行make後可能會報錯,不同的編譯器版本出現的錯誤不一樣,本人剛開始使用 ,aarch-linux-gnu 7.2.1版本編譯器,出現如下錯誤:

複製代碼
…/…/include/QtCore/…/…/src/corelib/tools/qmap.h: In instantiation of ‘T& QMap<Key, T>::operator[](const Key&) [with Key = int; T = inotify_event]’:
io/qfilesystemwatcher_inotify.cpp:364:33: required from here
…/…/include/QtCore/…/…/src/corelib/tools/qmap.h:531:45: error: value-initialization of incomplete type ‘char []’
node = node_create(d, update, akey, T());
^~~
複製代碼
google了一波並沒有找到解決辦法,個人感覺可能是qt代碼太老的關係,好多東西到現在的Qt5.11都已經棄用,編譯器太新導致出錯,之前用aarch64-linux-gnu 7.2.1編譯qt5.5.1並沒有出現這個錯誤,所以決定換個編譯器的版本嘗試一下。改用aarch64-linux-gnu 5.3.1版本後,沒有出現這個錯誤。

但是在後面編譯時出現了新的錯誤,如下:

複製代碼
runtime/JSValue.h: In constructor ‘JSC::JSValue::JSValue(JSC::JSCell*)’:
runtime/JSValue.h:494:57: error: cast from ‘JSC::JSCell*’ to ‘int32_t {aka int}’ loses precision [-fpermissive]
u.asBits.payload = reinterpret_cast<int32_t>(ptr);
^
runtime/JSValue.h: In constructor ‘JSC::JSValue::JSValue(const JSC::JSCell*)’:
runtime/JSValue.h:506:78: error: cast from ‘JSC::JSCell*’ to ‘int32_t {aka int}’ loses precision [-fpermissive]
u.asBits.payload = reinterpret_cast<int32_t>(const_cast<JSCell*>(ptr));
^
make[1]: *** [.obj/release-static-emb-armv8/JSBase.o] Error 1
make[1]: Leaving directory `/opt/qt-everywhere-opensource-src-4.7.3/src/3rdparty/webkit/JavaScriptCore’
make: *** [sub-javascriptcore-make_default-ordered] Error 2
複製代碼
google了一下,原來是Qt4.7的一個Bug,國外大胸弟們也是一頓操作,然而並沒有給出具體的解決辦法,不知哪來的靈感,突然想到在64位arm上跑,會不會因爲ptr 大於int32_t導致的出錯,所以把494和506行的int32_t改成int64_t,竟然編譯通過了,但是編譯完成後並沒有生成webkit的動態庫,很是無語。這個錯誤就是編譯webkit第三方庫的時候出現的,爲什麼編譯通過後沒有libQtWebKit.so.4.7.3呢!

既然沒有生成webkit庫,那就在configure後面加上參數 -webkit,指明編譯這個庫。configure後生成新的Makefile,make繼續填坑。編譯過程中又出現了這個錯誤。打開JSValue.h文件發現是修改過的int64_t,執行command:

[root@jz4775dev]# find ./ -name JSValue.h
./src/3rdparty/webkit/WebCore/ForwardingHeaders/runtime/JSValue.h
./src/3rdparty/webkit/JavaScriptCore/runtime/JSValue.h
./src/3rdparty/javascriptcore/JavaScriptCore/runtime/JSValue.h
原來有三個!

一個個來查看:

複製代碼
[root@jz4775dev]# vim ./src/3rdparty/webkit/WebCore/ForwardingHeaders/runtime/JSValue.h

1 #ifndef WebCore_FWD_JSValue_h
2 #define WebCore_FWD_JSValue_h
3 #include <JavaScriptCore/JSValue.h>
4 #endif
複製代碼
不是這個;

複製代碼
[root@jz4775dev]# vim ./src/3rdparty/webkit/JavaScriptCore/runtime/JSValue.h

487
488 inline JSValue::JSValue(JSCell* ptr)
489 {
490 if (ptr)
491 u.asBits.tag = CellTag;
492 else
493 u.asBits.tag = EmptyValueTag;
494 u.asBits.payload = reinterpret_cast<int32_t>(ptr);
495 #if ENABLE(JSC_ZOMBIES)
496 ASSERT(!isZombie());
497 #endif
498 }
499
500 inline JSValue::JSValue(const JSCell* ptr)
501 {
502 if (ptr)
503 u.asBits.tag = CellTag;
504 else
505 u.asBits.tag = EmptyValueTag;
506 u.asBits.payload = reinterpret_cast<int32_t>(const_cast<JSCell*>(ptr));
507 #if ENABLE(JSC_ZOMBIES)
508 ASSERT(!isZombie());
509 #endif
510 }
複製代碼
就是你了,把int32_t改成int64_t後繼續編譯,編譯順利完成。

這時在 “ls lib/” 查看:

複製代碼
[root@jz4775dev]# ls lib/
fonts libQtCore.so libQtDeclarative.so.4.7 libQtNetwork.la libQtScript.la libQtScriptTools.so.4.7 libQtSvg.so libQtWebKit.la libQtXml.so
libphonon.la libQtCore.so.4 libQtDeclarative.so.4.7.3 libQtNetwork.prl libQtScript.prl libQtScriptTools.so.4.7.3 libQtSvg.so.4 libQtWebKit.prl libQtXml.so.4
libphonon.prl libQtCore.so.4.7 libQtGui.la libQtNetwork.so libQtScript.so libQtSql.la libQtSvg.so.4.7 libQtWebKit.so libQtXml.so.4.7
libpvrQWSWSEGL.prl libQtCore.so.4.7.3 libQtGui.prl libQtNetwork.so.4 libQtScript.so.4 libQtSql.prl libQtSvg.so.4.7.3 libQtWebKit.so.4 libQtXml.so.4.7.3
libQAxContainer.prl libQtDBus.la libQtGui.so libQtNetwork.so.4.7 libQtScript.so.4.7 libQtSql.so libQtTest.la libQtWebKit.so.4.7 pkgconfig
libQAxServer.prl libQtDBus.prl libQtGui.so.4 libQtNetwork.so.4.7.3 libQtScript.so.4.7.3 libQtSql.so.4 libQtTest.prl libQtWebKit.so.4.7.3 README
libQt3Support.la libQtDeclarative.la libQtGui.so.4.7 libQtOpenGL.la libQtScriptTools.la libQtSql.so.4.7 libQtTest.so libQtXml.la
libQt3Support.prl libQtDeclarative.prl libQtGui.so.4.7.3 libQtOpenGL.prl libQtScriptTools.prl libQtSql.so.4.7.3 libQtTest.so.4 libQtXmlPatterns.la
libQtCore.la libQtDeclarative.so libQtMultimedia.la libQtOpenVG.la libQtScriptTools.so libQtSvg.la libQtTest.so.4.7 libQtXmlPatterns.prl
libQtCore.prl libQtDeclarative.so.4 libQtMultimedia.prl libQtOpenVG.prl libQtScriptTools.so.4 libQtSvg.prl libQtTest.so.4.7.3 libQtXml.prl
複製代碼
libQtWebKit.so.4.7.3 有了,嗯…美滋滋!

然後執行command:

make install
就會把生成的庫等相干東西安裝在/opt/qt-4.7.3-arm64目錄下。至此,交叉編譯告一段落。下面的任務就是移植到arm開發板上。

3.移植到arm開發板上
方法很簡單,把qt-4.7.3-arm64打包,生成qt-4.7.3-arm64.tgz。把它放到開發板的上,放在哪你自己決定,我是同樣放在/opt目錄下,然後解壓。

編輯開發板上 /etc/profile文件,在最後一行添加如下環境變量(QT4.7.3不添加環境變量也可以運行,但是Qt5.5.1就必須添加環境變量):

複製代碼

Configure the runtime environment for Qt

export QTDIR=/opt/qt-4.7.3-arm64
export LD_LIBRARY_PATH=QTDIR/lib:QTDIR/lib:LD_LIBRARY_PATH
export QT_QWS_FONTDIR=$QTDIR/lib/fonts
export QWS_SIZE=800x400
export QWS_DISPLAY=LinuxFb:/dev/fb0(這個根據開發板而定)
複製代碼
添加完後wq保存退出,執行command:

source /etc/profile
使修改生效,然後你就可以在你的開發板上運行你的qtdemo啦…

複製代碼
localhost:/opt/qt-4.7.3-arm64/examples/webkit # file fancybrowser/fancybrowser
fancybrowser/fancybrowser: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, for GNU/Linux 3.7.0, BuildID[sha1]=68c7b85ea380524f07bcc49da63dff2505ddfb57, stripped

查看demo的可執行文件的類型,基於ARM aarch64,正確的。
複製代碼

《題外篇》
如果想要實現觸摸功能,需要編譯tslib.

4.編譯tslib
Tslib是一個開源的程序,能夠爲觸摸屏驅動獲得的採樣提供諸如濾波、去抖、校準等功能,通常作爲觸摸屏驅動的適配層,爲上層的應用提供了一個統一的接口。在採用觸摸屏的移動終端中,觸摸屏性能的調試是個重要問題之一,因爲電磁噪聲的緣故,觸摸屏容易存在點擊不準確、有抖動等問題。

到 github 下載 tslib最新版,地址:https://github.com/kergoth/tslib,下載後文件名爲:tslib-master.zip。

1.建立工作目錄
cd /opt
mkdir tslib
2.編譯安裝tslib
將下載的tslib源碼複製到/opt目錄下,並解壓:

unzip tslib-master.zip
cd tslib-master
3.編譯
配置tslib,安裝路徑可以通過 --prefix 參數設置,這裏安裝到 /opt/tslib:

./autogen.sh
./configure CC=aarch64-linux-gnu-gcc CXX=aarch64-linux-gnu-g++ --host=aarch64-linux-gnu --prefix=/opt/tslib ac_cv_func_malloc_0_nonnull=yes

編譯安裝:

make
make install
完成後,tslib會按安裝到主機 /opt/tslib 目錄下。 進入下一步之前,先將主機中 /opt/tslib/etc/ts.conf 文件第二行“#module_raw input”的註釋去掉,變爲“module_raw input”,注意一定要頂格(哥哥編譯好時第二行的註釋符#已經去掉了)。

這時qmake.conf文件修改爲如下:

複製代碼
1 #
2 # qmake configuration for building with arm-none-linux-gnueabi-g++
3 #
4
5 include(…/…/common/g++.conf)
6 include(…/…/common/linux.conf)
7 include(…/…/common/qws.conf)
8
9 # modifications to g++.conf
10 QMAKE_CC = aarch64-linux-gnu-gcc -lts
11 QMAKE_CXX = aarch64-linux-gnu-g++ -lts
12 QMAKE_LINK = aarch64-linux-gnu-g++ -lts
13 QMAKE_LINK_SHLIB = aarch64-linux-gnu-g++ -lts
14
15 # modifications to linux.conf
16 QMAKE_AR = aarch64-linux-gnu-ar cqs
17 QMAKE_OBJCOPY = aarch64-linux-gnu-objcopy
18 QMAKE_STRIP = aarch64-linux-gnu-strip
19
20 load(qt_config)

複製代碼
configure也要添加新的參數:

-no-mouse-qvfb -qt-mouse-linuxtp -qt-mouse-tslib -DQT_QLOCALE_USES_FCVT -DQT_NO_QWS_CURSOR -no-pch -I/opt/tslib/include -L/opt/tslib/lib -confirm-license
然後再make && make install

編譯好後把qt-4.7.3-arm64和tslib同時拷貝到開發板/opt下。 編輯/etc/profile添加環境變量:

複製代碼
export QTDIR=/opt/qt-4.7.3-arm64
export T_ROOT=/opt/tslib
export PATH=TROOT/bin:T_ROOT/bin:PATH
export LD_LIBRARY_PATH=TROOT/lib:T_ROOT/lib:QTDIR/lib:LDLIBRARYPATHexportTSLIBCONSOLEDEVICE=noneexportTSLIBFBDEVICE=/dev/fb0exportTSLIBTSDEVICE=/dev/input/event0exportTSLIBPLUGINDIR=LD_LIBRARY_PATH export TSLIB_CONSOLEDEVICE=none export TSLIB_FBDEVICE=/dev/fb0 export TSLIB_TSDEVICE=/dev/input/event0 export TSLIB_PLUGINDIR=T_ROOT/lib/ts
export TSLIB_CONFFILE=TROOT/etc/ts.confexportTSLIBCALIBFILE=/etc/pointercalexportQWSKEYBOARD=USB:/dev/input/event1exportQWSMOUSEPROTO=Tslib:/dev/input/event0exportQTQWSFONTDIR=T_ROOT/etc/ts.conf export TSLIB_CALIBFILE=/etc/pointercal export QWS_KEYBOARD=USB:/dev/input/event1 export QWS_MOUSE_PROTO=Tslib:/dev/input/event0 export QT_QWS_FONTDIR=QTDIR/lib/fonts

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章