准备
- 主机平台:Ubuntu 16.04 LTS(x64)
- 目标平台:ARM40-A5D3
- Qt版本:Qt4.8.7
- tslib github
- ARM-GCC编译工具链:gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi
交叉编译工具链
- 下载gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi.tar.xz
- 安装ARM-GCC编译工具链
$ sudo xz -d gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi.tar.xz
$ ls
$ sudo tar xvf gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi.tar -C /opt/
- 编辑.bashrc文件
$ cd ~
$ vim .bashrc
- 在.bashrc的末尾添加下面的文本
export PATH=$PATH:/opt/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi/bin/
- 查看ARM-GCC版本
$ arm-linux-gnueabi-gcc -v
Thread model: posix
gcc version 4.9.4 (Linaro GCC 4.9-2017.01)
安装tslib
使用浏览器下载tslib
使用git下载tslib
$ sudo apt-get install git
$ git clone https://github.com/kergoth/tslib.git
正克隆到 ‘tslib’…
remote: Counting objects: 5089, done.
remote: Total 5089 (delta 0), reused 0 (delta 0), pack-reused 5089
接收对象中: 100% (5089/5089), 2.39 MiB | 429.00 KiB/s, 完成.
处理 delta 中: 100% (3505/3505), 完成.
检查连接… 完成。
- 编译tslib
$ sudo apt-get install automake libtool
$ sudo mkdir /opt/tslib
$ cd tslib
$ ./autogen.sh
$ ./configure CC=arm-linux-gnueabi-gcc \
CXX=arm-linux-gnueabi-g++ \
--prefix=/opt/tslib \
--host=arm-linux-gnueabi \
ac_cv_func_malloc_0_nonnull=yes
$ make&&sudo make install
- 编译报错
/home/jonny/tslib/libtool: line 10540: arm-linux-gnueabi-gcc: command not found
libtool: error: error: relink ‘linear.la’ with the above command before installing it
Makefile:755: recipe for target ‘install-pluginexecLTLIBRARIES’ failed
make2: * [install-pluginexecLTLIBRARIES] Error 1
make2: Leaving directory ‘/home/jonny/tslib/plugins’
Makefile:1021: recipe for target ‘install-am’ failed
make1: * [install-am] Error 2
make1: Leaving directory ‘/home/jonny/tslib/plugins’
Makefile:483: recipe for target ‘install-recursive’ failed
make: * [install-recursive] Error 1 - 解决方案
原因:sudo命令使用的是root的环境变量,sudo就找不到ARM-GCC了
解决:添加ARM-GCC的绝对路径就好了
$ ./configure CC=/opt/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi/bin/arm-linux-gnueabi-gcc \
CXX=/opt/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi/bin/arm-linux-gnueabi-g++ \
--prefix=/opt/tslib \
--host=arm-linux-gnueabi \
ac_cv_func_malloc_0_nonnull=yes
- 查看tslib
$ ls /opt/tslib/
bin etc include lib share
编译Qt4.8.7
- 下载qt-everywhere-opensource-src-4.8.7.tar.gz
- 编辑qmake.conf
$ cd ~
$ tar xvf qt-everywhere-opensource-src-4.8.7.tar.gz ./
$ cd qt-everywhere-opensource-src-4.8.7/
$ vim ./mkspecs/qws/linux-arm-gnueabi-g++/qmake.conf
#
# qmake configuration for building with arm-none-linux-gnueabi-g++
#
include(../../common/linux.conf)
include(../../common/gcc-base-unix.conf)
include(../../common/g++-unix.conf)
include(../../common/qws.conf)
# modifications to g++.conf
QMAKE_CC = /opt/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi/bin/arm-linux-gnueabi-gcc -lts
QMAKE_CXX = /opt/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi/bin/arm-linux-gnueabi-g++ -lts
QMAKE_LINK = /opt/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi/bin/arm-linux-gnueabi-g++ -lts
QMAKE_LINK_SHLIB = /opt/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi/bin/arm-linux-gnueabi-g++ -lts
# modifications to linux.conf
QMAKE_AR = /opt/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi/bin/arm-linux-gnueabi-ar cqs
QMAKE_OBJCOPY = /opt/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi/bin/arm-linux-gnueabi-objcopy
QMAKE_STRIP = /opt/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi/bin/arm-linux-gnueabi-strip
load(qt_config)
- configure编译配置
-debug-and-release \ Qt调试;
-shared \ 动态编译;
-static \ 静态编译;
-make docs \ 文档帮助;
-DQT_NO_QWS_CURSOR \ 不显示鼠标
$ ./configure \
--prefix=/opt/qte4.8.7 \
-opensource \
-debug-and-release \
-shared \
-Declarative \
-fast \
-no-largefile \
-qt-sql-sqlite \
-qt3support \
-exceptions \
-xmlpatterns \
-script \
-scripttools \
-no-glib \
-no-phonon \
-svg \
-no-webkit \
-qt-zlib \
-qt-libtiff \
-qt-libpng \
-qt-libjpeg \
-make libs \
-nomake tools \
-nomake examples \
-make docs \
-nomake demos \
-no-nis \
-no-cups \
-no-iconv \
-no-dbus \
-xplatform qws/linux-arm-gnueabi-g++ \
-embedded arm \
-little-endian \
-qt-freetype \
-depths 16,24,32 \
-qt-gfx-linuxfb \
-no-gfx-transformed \
-no-gfx-multiscreen \
-no-gfx-vnc \
-no-gfx-qvfb \
-qt-kbd-linuxinput \
-qt-kbd-tty \
-no-kbd-qvfb \
-armfpa \
-optimized-qmake \
-no-mouse-qvfb \
-qt-mouse-linuxtp \
-qt-mouse-tslib \
-DQT_QLOCALE_USES_FCVT \
-DQT_NO_QWS_CURSOR \
-pch \
-I/opt/tslib/include \
-L/opt/tslib/lib \
-confirm-license
- 编译安装Qt
$ sudo mkdir /opt/qte4.8.7
$ make -j 4
$ sudo make install
编译报错
make3: Leaving directory ‘/home/jonny/qt-everywhere-opensource-src-4.8.7/tools/linguist/linguist’
make2: Leaving directory ‘/home/jonny/qt-everywhere-opensource-src-4.8.7/tools/linguist’
Makefile:339: recipe for target ‘sub-linguist-make_default-ordered’ failed
make1: * [sub-linguist-make_default-ordered] Error 2
make1: Leaving directory ‘/home/jonny/qt-everywhere-opensource-src-4.8.7/tools’
Makefile:742: recipe for target ‘sub-tools-make_default-ordered’ failed
make: * [sub-tools-make_default-ordered] Error 2
— 解决方案:configure项添加 -nomake tools 或者直接忽视之
Makefile:1054: recipe for target ‘.moc/release-shared-emb-arm/moc_qabstractanimation.cpp’ failed
make1: * [.moc/release-shared-emb-arm/moc_qabstractanimation.cpp] Error 2
make1: * 正在等待未完成的任务….
Makefile:1314: recipe for target ‘.moc/release-shared-emb-arm/moc_qvariantanimation.cpp’ failed
make1: * [.moc/release-shared-emb-arm/moc_qvariantanimation.cpp] Error 2
Makefile:1433: recipe for target ‘.moc/release-shared-emb-arm/moc_qpropertyanimation.cpp’ failed
make1: * [.moc/release-shared-emb-arm/moc_qpropertyanimation.cpp] Error 2
make1: Leaving directory ‘/home/jonny/qt-everywhere-opensource-src-4.8.7/src/corelib’
Makefile:201: recipe for target ‘sub-corelib-make_default-ordered’ failed
make: * [sub-corelib-make_default-ordered] Error 2
解决方案:一般都是编译器路径有问题导致的,检查qmake.conf文件
查看Qt版本
$ cd /opt/qte4.8.7/bin/
$ ./qmake -v
QMake version 2.01a
Using Qt version 4.8.7 in /opt/qte4.8.7/lib
至此,Qt4.8.7交叉编译完成。