|  | 
 
| 环境 国产系统:UOS20
 内核版本:4.19.0-arm64-desktop
 处理器:华为鲲鹏920@2.6GHz
 
 
 目标,将现有Qt项目移植到改系统下进行QML项目开发。
 
 开始
 准备安装Qt5.15.2 ,Qt官方提供的安装包都是x86架构下的,不能直接在arm架构下安装,网上看了很多示例,说可以直接在终端通过命令行来安装:
 sudo aptitude install libdtkwidget-dev qt5-default qtcreator qtdeclarative5-dev
 
 这样确实可以安装Qt,但是装的是默认版本,经测试安装后是Qt5.11.3。
 
 我需要的是Qt5.15,所以只能下载Qt源码进行交叉编译安装。
 
 下载源码
 首先在官网下载Qt5.15.2的源码:地址在这里
 
 
 注意:一定要下载第二个,虽然这里的两个源码包只是压缩格式不同,但是经测试,第一个源码包在编译的时候会报一些奇怪的错误,比如运行configure时报错:
 
 /bin/sh^M:解释器错误:没有那个文件或目录
 1
 这其实是由于该文件在windows下打开编辑过,换行结尾是\n\r , 而在linux下 是\n,所以才会有 多出来的\r,导致报错,解决方法是执行:sed -i 's/\r$//' configure,但是解决后又会出现其他文件的这种问题。所以直接下载第二个,就不会有这些问题了。
 
 解压
 进入到下载好的源码目录,输入命令解压:
 
 tar -xvf qt-everywhere-src-5.15.2.tar.xz
 1
 检查编译器
 在编译前,先检查一下本机是否有安装交叉编译工具,我们这里选用的交叉编译工具是aarch64-linux-gnu-g++ ,在终端输入aarch64-linux-gnu- 然后按两次tab键 会看到下面列表,说明本机已经安装过了
 
 
 
 如果没有的话,需要先安装,可以通过命令先查看有哪些版本可以安装:sudo apt-cache search aarch64
 
 
 然后通过apt-get install 安装响应的版本即可。
 
 创建配置脚本
 解压后,进入到源码目录,新建一个脚本文件并编辑:vim autoConfigure.sh
 
 #!/bin/sh
 ./configure \
 -prefix /home/admin123/qt5.15.2_ARM \
 -confirm-license \
 -opensource \
 -release \
 -make libs \
 -nomake examples \
 -pch \
 -qt-libjpeg \
 -qt-libpng \
 -qt-zlib \
 -fontconfig \
 -system-freetype \
 -opengl \
 -xcb \
 -dbus \
 -alsa \
 -gif \
 -gstreamer 1.0 \
 -pulseaudio
 
 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 prefix /usr/bin/qt5.15.2_ARM 是配置编译完成后安装的地址,可自行设置
 -xplatform linux-aarch64-gnu-g++ 是设置交叉编译器,如果不需要交叉编译,就不用设置此项,如果没有安装要先通过命令安装
 
 注意,我这里没有做功能裁剪,如果有些功能用不上,可以在这里配置,不进行编译(比如 -skip xx , -no xx),对configure文件的配置具体说明见这里
 
 注意,如果是要做Qt Quick项目,那一定要加上 -xcb, 编译quick项目是需要依赖这个玩意儿,网上很多在这里设置编译配置是直接把xcb去掉不进行编译, 由于我也是第一次弄这个玩意儿,所以走了很多弯路。如果不编译xcb就会报错,qt.qpa.plugin: Could not find the Qt platform plugin “xcb” in ""
 
 开始编译
 先修改一下配置文件的权限:
 
 chmod 777 autoConfigure.sh
 1
 运行脚本
 
 sudo ./autoConfigure.sh
 1
 执行configure可能会遇到的问题
 
 
 
 ERROR: Feature 'xcb' was enabled, but the pre-condition 'features.thread && libs.xcb && tests.xcb_syslibs && features.xkbcommon-x11' failed.
 
 ERROR: Feature 'opengl' was enabled, but the pre-condition 'features.opengl-desktop || features.opengl-dynamic || features.opengles2' 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.
 
 ERROR: Feature 'alsa' was enabled, but the pre-condition 'config.unix && !config.qnx && libs.alsa' failed.
 
 ERROR: Feature 'gstreamer_1_0' was enabled, but the pre-condition 'libs.gstreamer_1_0' failed.
 
 ERROR: Feature 'pulseaudio' was enabled, but the pre-condition 'libs.pulseaudio' failed.
 
 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 这是由于我们添加了响应的编译项,然后系统中缺少相关的库而导致报错,接下来就要一个个的安装这些依赖库了。
 
 参考这里安装相关依赖:https://www.cnblogs.com/ahuo/p/11286843.html
 
 pulseaudio的错误安装依赖:sudo apt-get install pulseaudio*
 gstreamer的错误安装依赖:sudo apt-get install libgstreamer* gstreamer*
 xcb的错误安装依赖:sudo apt-get install libxkbcommon* libxcb* libthread*
 
 其他的根据错误类型自行查找安装
 
 注意,在执行configure之前,记得先删除config.cache 缓存文件
 
 开始编译
 
 sudo make -j4
 
 1
 2
 安装
 
 sudo make install
 1
 编译中遇到的问题
 我在编译的时候出现过一个错误,实在location模块中,错误如下:
 
 提示:error: ‘program’ was not declared in this scope program()->setUniformValue(m_color_id,v); …
 一大堆这种类似错误,原本我打算通过配置configure使其编译的时候跳过这个模块,但是没啥用,后来干脆直接把源码下面这个location目录删了,这个问题就搞定咯,反正我项目里面不需要用到location模块。
 
 
 配置Qt环境
 在以上步骤编译完成后,会在我们配置的安装目录下生成所有Qt的相关文件,/usr/bin/qt5.15.2_ARM
 
 首先,需要将Qt的路径配置到环境变量
 
 vi ~/.profile
 1
 在最后面输入:
 
 export PATH=/usr/bin/qt5.15.2_ARM/bin
 export QT_QPA_PLATFORM_PLUGIN_PATH=/usr/bin/qt5.15.2_ARM/plugins/platforms
 1
 2
 通过终端安装一个QtCreator:
 
 sudo apt-get install qtcreator
 1
 安装后打开Qt Creator进行配置:
 
 Qt版本添加一项,填入qmake地址:
 
 添加编译器设置:
 
 
 
 最后设置编译套件,新添加一个编译套件,将编译器和qt设置成上面对应的版本。
 
 
 ok,接下来就可以创建项目编译了。
 
 编译项目可能会遇到的问题
 上面我们提到,编译QML 项目需要依赖xcb,否则会报错:
 
 qt.qpa.plugin: Could not find the Qt platform plugin \"xcb\" in ""
 1
 
 这也是我遇到的一个很大的坑,网上有很多这个问题的解决方案,都是说环境变量没设置导致的,但是其实最重要的是先看看安装Qt目录下有没有这个库,我们打开Qt的安装目录:
 
 /usr/bin/qt5.15.2_ARM/plugins/platforms/
 1
 正常情况下会有一个qxcb库
 
 如果没有的话说明源码编译是有问题的,鉴于我们在编译源码的配置中并没有跳过任何模块,但是为啥没有生成这个库呢
 
 打开Qt的源码目录,找到xcb目录:
 
 打开后有一个README 文件,打开后发现:
 
 Requires libxcb >= 1.9.1.
 1
 这就说明要编译出qxcb库,需要本地先安装libxcb 并且版本不低于1.9.1
 
 好吧,大概知道问题了,可能是本地安装的xcb版本不够导致的。
 
 所以接下来只要安装一个新版本的xcb库就可以正常编译源码了,编译完成后就可以在plugins/platforms/下找到libqxcb.so了。
 还要注意设置环境变量:export QT_QPA_PLATFORM_PLUGIN_PATH=/usr/bin/qt5.15.2_ARM/plugins/platforms,在上面已经写过了。
 
 ok,后面我会单独写一篇介绍如何安装新版xcb库。
 
 Enjoy~
 ————————————————
 版权声明:本文为CSDN博主「luoyayun361」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
 原文链接:https://blog.csdn.net/luoyayun361/article/details/118395262
 
 
 | 
 |