ubuntu x86_64编译qt arm/aarch64库
参考https://blog.csdn.net/qq_30155503/article/details/80118705
pc机:ubuntu18.04 x86_64
树莓派:ubuntu18.04 aarch64
一、下载qt源码
1、因为pc机已经安装过qt,在qt安装路径下查看安装qt时是否保留了源码,如果保留了则可直接使用该源码,否则需要下载qt源码
$ cd QT5/5.11.1
可以看到我安装qt时编译了android x86、android arm、linux gcc_64 三个版本,并且保留了源码Src
2、为防止过程中破环或丢失源码,拷贝源码备份用于编译arm库
$ cp -r Src Src-arm
$ cp -r Src Src-aarch64
二、安装 arm-linux-gcc、 gcc-aarch64-linux交叉编译器
1、apt-get 自动安装
$ sudo apt-get install gcc-arm-linux-gnueabihf
$ sudo apt-get install g++-arm-linux-gnueabihf
$ sudo apt install gcc-aarch64-linux-gnu
$ sudo apt install g++-aarch64-linux-gnu
2、查看是否安装成功
$ arm-linux-gnueabihf-gcc -v
$ arm-linux-gnueabihf-g++ -v
$ aarch64-linux-gnu-gcc --version
$ aarch64-linux-gnu-g++ --version
3、测试
编写一个简单的测试文件test.c,内容如下
#include <stdio.h>
int main()
{
printf("Hello World!\n");
return 0;
}
编译test.c
$ arm-linux-gnueabihf-gcc -o test-arm test.c
$ aarch64-linux-gnu-gcc -o test-aarch64 test.c
在书梅派上运行test-aarch64成功,运行test-arm报错:
-sh: ./test-arm: No such file or directory
解决:
查看arm系统,发现为aarch64,所以arm-linux-gnueabihf-gcc编译的程序在该系统上出错,如果使用aarch64-linux-gnu-gcc编译test,可直接在aarch64系统上使用了
$ uname -a
如果想要 test-arm也运行成功,我们的程序使用的是动态链接方式编译的,而ARM上的链接库文件路径不同,导致找不到文件,可以用gcc -static命令改用静态链接的方式编译,这样arm-linux-gnueabihf编译的程序也能在aarch64系统上运行了
$ arm-linux-gnueabihf-gcc -o test-arm test.c -static
三、安装编译arm、aarch64版本需要的触摸屏校准库
参考https://blog.csdn.net/qq_30155503/article/details/80117395
针对arm版本:
1、下载触摸屏校准库tslib
$ git clone https://github.com/libts/tslib.git
2、生成config文件
$ ./autogen.sh
3、配置编译条件,安装路径设置为/usr/work/lib/arm/tslib
$ ./configure CC=arm-linux-gnueabi-gcc CXX=arm-linux-gnueabi-g++ --host=arm-linux-gnueabi --prefix=/usr/work/lib/arm/tslib ac_cv_func_malloc_0_nonnull=yes
4、编译安装
$ make
$ make install
此时在安装路径下查看是否成功,有如下五个文件夹,安装成功
5、针对aarch版本,与上面arm版本过程一样,只须将步骤3配置编译条件时改为
$ ./configure CC=/usr/bin/aarch64-linux-gnu-gcc CXX=/usr/bin/aarch64-linux-gnu-g++ --host=aarch64-linux-gnu --prefix=/usr/work/lib/aarch64/tslib ac_cv_func_malloc_0_nonnull=yes
四、编译arm\aarch64版本xcb
1、下载xbc、xcb-proto、xau
xbc、xcb-proto下载网址:https://xcb.freedesktop.org/dist/
xau下载网址:https://www.x.org/releases/individual/lib/
2、解压
$ tar -zxvf ~/Downloads/libxcb-1.14.tar.gz
$ tar -zxvf ~/Downloads/xcb-proto-1.14.tar.gz
$ tar -zxvf ~/Downloads/libXau-1.0.9.tar.gz
3、编译安装xcb-proto
$ CC=aarch64-linux-gnu-gcc CXX=aarch64-linux-gnu-g++ ./configure --prefix=/usr/work/lib/aarch64/xcb-proto --host=aarch64-linux-gnu
$ CC=arm-linux-gnueabi-gcc CXX=arm-linux-gnueabi-g++ ./configure --prefix=/usr/work/lib/arm/xcb-proto --host=arm-linux-gnueabi
$ make
$ make install
$ export PKG_CONFIG_PATH=/usr/work/lib/aarch64/xcb-proto/lib/pkgconfig //设置环境变量PKG_CONFIG_PATH,否则xcb编译时会报错“No package 'xcb-proto' found”
$ export PKG_CONFIG_PATH=/usr/work/lib/arm/xcb-proto/lib/pkgconfig
4、编译安装xau
$ CC=aarch64-linux-gnu-gcc CXX=aarch64-linux-gnu-g++ ./configure --prefix=/usr/work/lib/aarch64/libxau --host=aarch64-linux-gnu --enable-option-
checking
$ CC=arm-linux-gnueabi-gcc CXX=arm-linux-gnueabi-g++ ./configure --prefix=/usr/work/lib/arm/libxau --host=arm-linux-gnueabi --enable-option-
checking
$ make
$ make install
5、编译安装xcb
$ CC=aarch64-linux-gnu-gcc CXX=aarch64-linux-gnu-g++ CFLAGS=-I/usr/work/lib/aarch64/libxau/include LDFLAGS=-L/usr/work/lib/aarch64/libxau/lib ./configure --prefix=/usr/work/lib/aarch64/xcb --host=aarch64-linux-gnu
$ CC=arm-linux-gnueabi-gcc CXX=arm-linux-gnueabi-g++ CFLAGS=-I/usr/work/lib/arm/libxau/include LDFLAGS=-L/usr/work/lib/arm/libxau/lib ./configure --prefix=/usr/work/lib/arm/xcb --host=arm-linux-gnueabi
$ make
$ make install
提示未设置环境变量 PKG_CONFIG_PATH,解决办法如上步骤3设置PKG_CONFIG_PATH
提示找不到xau,解决办法是在安装xbc前安装xau
五、编译arm qt库
1、查看并修改编译架构信息
在源码目录下,进入qtbase/mkspecs 目录可以看到各种支持的架构,我们要选择的是 linux-arm架构,进入linux-arm-gnueabi-g++目录查看qmake.conf文件中的编译配置参数
$ cd QT5/5.11.1/Src-arm
$ cd qtbase/mkspecs/
$ gedit linux-arm-gnueabi-g++/qmake.conf
qmake.conf中指定编译器与我们安装的编译器相符,所以不需修改
2、配置编译参数
返回源码目录
$ cd QT5/5.11.1/Src-arm
编写一个脚本build.sh配置编译参数,内容如下
运行build.sh脚本
$ chmod +x build.sh
$ ./build.sh
报错:
ERROR: Feature 'tslib' was enabled, but the pre-condition 'libs.tslib' failed.
ERROR: The OpenGL functionality tests failed!
You might need to modify the include and library search paths by editing QMAKE_INCDIR_OPENGL[_ES2],
QMAKE_LIBDIR_OPENGL[_ES2] and QMAKE_LIBS_OPENGL[_ES2] in the mkspec for your platform.
解决:
找不到tslib库,所以配置文件末尾加上-recheck-all选项;找不到opengl库,因为没有安装,所以qt先不支持opengl
修改后build.sh如下,再次运行脚本不报错
修改:
#!/bin/sh
./configure \
-prefix /usr/work/lib/QT5/5.11.1/linux-arm \
-opensource \
-confirm-license \
-release \
-xplatform linux-arm-gnueabi-g++ \
-pch \
-sql-sqlite \
-qt-libjpeg \
-qt-libpng \
-tslib \
-qt-zlib \
-no-opengl \
-I /usr/work/lib/aarch64/tslib/include \
-L /usr/work/lib/aarch64/tslib/lib \
-recheck-all
# -prefix qt-arm安装路径
# -opensource 编译并链接Qt的开源版本
# -confirm-license 自动确认许可证
# -release 发行版
# -xplatform 交叉编译的目标平台
# -pch 预编译头文件
# -sql -sqlite 数据库
# -qt-libjpeg 使用与Qt捆绑在一起的libjpeg
# -qt-libpng 使用与Qt捆绑在一起的libpng
# -tslib 编译对tslib的支持
# -qt-zlib 使用与Qt捆绑在一起的zlib
# -I 添加一个显式包含路径
# -L 添加一个明确的库路径
3、编译安装
$ make //需要比较长的时间
$ sudo make install
查看安装路径,安装成功
六、编译aarch64 qt版
1、查看并修改编译架构信息
在源码目录下,进入qtbase/mkspecs 目录可以看到各种支持的架构,我们要选择的是 linux-aarch64架构,进入linux-aarch64-gnu-g++目录查看qmake.conf文件中的编译配置参数
$ cd QT5/5.11.1/Src-aarch64
$ cd qtbase/mkspecs/
$ gedit linux-aarch64-gnu-g++/qmake.conf
qmake.conf中指定编译器与我们安装的编译器相符,所以不需修改
2、配置编译参数
返回源码目录
$ cd QT5/5.11.1/Src-aarch64
编写一个脚本build.sh配置编译参数,内容如下:
#!/bin/sh
./configure \
-prefix /usr/work/lib/QT5/5.11.1/linux-aarch64 \
-opensource \
-confirm-license \
-release \
-xplatform linux-aarch64-gnu-g++ \
-pch \
-sql-sqlite \
-qt-libjpeg \
-qt-libpng \
-tslib \
-qt-zlib \
-no-opengl \
-qt-xcb \
-I /usr/work/lib/aarch64/tslib/include \
-I /usr/work/lib/aarch64/xcb/include \
-L /usr/work/lib/aarch64/tslib/lib \
-L /usr/work/lib/aarch64/xcb/lib \
-recheck-all
# -prefix qt-arm安装路径
# -opensource 编译并链接Qt的开源版本
# -confirm-license 自动确认许可证
# -release 发行版
# -xplatform 交叉编译的目标平台
# -pch 预编译头文件
# -sql -sqlite 数据库
# -qt-libjpeg 使用与Qt捆绑在一起的libjpeg
# -qt-libpng 使用与Qt捆绑在一起的libpng
# -tslib 编译对tslib的支持,触摸屏校准库
# -qt-zlib 使用与Qt捆绑在一起的zlib
# -I 添加一个显式包含路径
# -L 添加一个明确的库路径
# -qt-xcb xcb显示格式
# -recheck-all
运行build.sh脚本
$ chmod +x build.sh
$ ./build.sh
3、编译安装
$ make //需要比较长的时间
$ sudo make install