目录
- 前言
- 1.源码下载
- 2.编译安装
- 2.1 安装依赖
- 2.2 编译
- 2.3 遇到的问题
- 2.4 安装
- 3.编译qtwebengine
- 3.1 安装依赖库
- 3.2 编译
- 3.3 遇到的问题
- 3.4 安装
- 4.配置开发环境
- 5.测试
- 6.程序无法输入中文的问题
- 总结
前言
近期因参与开发的某个软件需要适配银河麒麟v10arm 平台,于是自己搭建起一套Qt 开发环境,在此记录下具体过程,以供有需要的朋友参考。一开始手上并没有Arm架构的PC,先在Windows下用Vs2017和QtCreator 开发,软件开发快结束的时候Arm PC到了。Qt 没有提供可直接安装的arm架构安装包,只能自己通过编译Qt 来搭建开发环境。
1.源码下载
下载Qt5.12.7,从这里下载Qt5.12.7 。一定要选择后缀为.tar.xz的源码包,zip源码包亲测编译时会遇到奇怪的问题。
2.编译安装
2.1 安装依赖
- 安装OpenGL依赖
sudo apt-get install build-essential
sudo apt-get install libgl1-mesa-dev
sudo apt-get install libglu1-mesa-dev
sudo apt-get install libegl1-mesa-dev
sudo apt-get install freeglut3-dev
2.2 编译
打开终端,cd到源码所在目录,执行configure程序并make,这里以编译release版本为例
./configure -prefix /opt/qt5.12.7 -opensource -release -nomake tests -skip qtvirtualkeyboard 接着执行make 命令make -j4
2.3 遇到的问题
编译过程遇到了一些问题,记录如下
1)问题一
/usr/bin/ld.gold:错误:cannot find -lclip2tri
/usr/bin/ld.gold:错误:cannot find -lpoly2tri
/usr/bin/ld.gold:错误:cannot find -lclipper
该问题的原因是qtlocation模块未编译完整,重新执行 make -j4 module-qtlocation 命令 可消除此错误,也可以在执行configure命令的时候添加 -skip qtlocation 来跳过编译。
2)问题二
xcb-xfixes development package not found
这个问题的解决方式是安装对应的软件包,执行下面的命令来安装,安装之后重新执行 make -j4。
sudo apt-get install libxcb-util0-dev
2.4 安装
除此之外还有其他一些小问题,根据错误提示就能解决,没记录下来。
make 结束之后,执行 sudo make install
命令,会将编译好的Qt开发环境安装到之前设置的目录下 /opt/qt5.12.7 。
3.编译qtwebengine
qtwebengine是后期需要引入echarts时才编译的,编译过程中也遇到了一些奇怪的问题,特在此记录下来备忘。qtwebengine需要用到qmake及Qt的一些核心库,因此必须先确保第3节中的qt编译完成。
3.1 安装依赖库
sudo apt-get install bison build-essential gperf flex libasound2-dev\
libcups2-dev libdrm-dev libegl1-mesa-dev libnss3-dev libpci-dev\
libpulse-dev libudev-dev nodejs libxtst-dev gyp ninja-build\
libssl-dev libxcursor-dev libxcomposite-dev libxrandr-dev
在安装 libnss3-dev 时报错,大概意思是版本不对,使用sudo apt-get install libnss3-dev = xxxversion ,安装成功。错误如下:
ibnss3-dev : 依赖: libnss3 (= 2:3.49.1-1kylin1.5) 但是 2:3.49.1-1kylin1.6 正要被安装
解决方法,安装指定版本的依赖包:
sudo apt-get install libnss3=2:3.49.1-1kylin1.5
3.2 编译
打开终端, cd 到 src/qtwebengine 目录下,执行命令:
../qtbase/bin/qmake qtwebengine.pro
3.3 遇到的问题
- gperf not found
执行完qmake 命令后报错:gperf not found,以为gperf 没有安装成功,再次使用apt-get 安装缺少的依赖,sudo apt-get install gperf ,安装完成后需要将configure命令生成的缓存清除掉然后重新执行configure 命令,并再次执行qmake,命令如下:
rm config.cache
./configure -prefix /opt/qt5.12.7 -opensource -release -nomake tests -skip qtvirtualkeyboard
../qtbase/bin/qmake qtwebengine.pro
make -j4
- X11/Xlib-xcb.h 找不到
不出意外开始编译了,经过漫长的等待,编译又出错了,这次遇到的是:fatal error X11/Xlib-xcb.h 文件不存在。第一感觉是缺少对应的库,经过一番查找发现需要安装 libx11-dev ,于是执行 sudo apt-get install libx11-dev,成功安装后仍然报错。通过find命令查找该头文件,确实没有找到 find /usr -name Xlib-xcb.h 。 我耐着性子查询了很多资料还是没能解决问题,这时只剩下最后一条路了,那就是下载libx11-dev源码,从libx11地址下载系统libX11版本对应的libx11-dev源码后,与当前系统/usr/lib/include/X11 目录进行比较发现系统重确实少了Xlib-xcb.h 文件,而下载的源码中刚好有这个文件,于是将 Xlib-xcb.h 复制到 /usr/lib/include/X11 目录下,重新执行 make -j4 继续编译。 - libXlib-xcb.so 找不到
又是漫长的等待过后报了一个错,这次是 libXlib-xcb.so 找不到,通过find命令发现在 /usr/lib/arm-linux-gnueabihf/ 目录下有这个库,根据报错信息提示在/usr/lib/aarch64-linux-gnu/ 目录下创建了一个 软连接 ln -s /usr/lib/arm-linux-gnueabihf/libXlib-xcb.so libXlib-xcb.so, 接着再次执行make -j4 ,这次没有提示libXlib-xcb.so 找不到,而是提示libXlib-xcb.so 不兼容。 - libXlib-xcb.so 不兼容
针对这个问题,我打算重新编译libXlib 库。首先安装libtool 和 autoconfig
sudo apt-get install libtool autoconf
切换到libXlib 源码根目录下 执行
./autogen.shconfigure.ac:24: error: must install xorg-macros 1.15 or later before running autoconf/autogen
下载对应的 rpm 安装包,下载地址
sudo rpm -ivh xorg-x11-util-macros-1.19.3-4.el9.noarch.rpm --nodeps --force
安装后再次执行
./autogen.sh
make
编译结束后会生成libXlib-xcb.so ,把库拷贝到/usr/lib 目录下, 删除之前创建的 /uar/lib/aarch64-linux-gnu 目录下的软连接,重新创建对应的软连接,然后回到qtwebengine 根目录下再次 执行 make -j4
- open CFI at the end of file; missing .cfi_endproc directive
这个问题是qtwebengine 编译过程中由于占用内存太多,而系统内存不足导致的报错。我用的设备内存是8G,交换空间是9G,为了解决这个问题将交换空间增加了20G,最终才编译成功。
以下是增加交换空间用到的几个命令:
#创建swap文件
mkdir -p /var/cache/swap
sudo dd if=/dev/zero of=/var/cache/swap/swap0 bs=1G count=20
#转换swap文件
sudo mkswap -f /var/cache/swap/swap0
#激活swap文件
sudo swapon /var/cache/swap/swap0
#卸载
sudo swapoff /var/cache/swap/swap0
#永久生效
sudo vim /etc/fstab
#写入以下内容:
/var/cache/swap/swap0 none swap defaults 0 0
再次执行make -j4这次成功生成了 libQt5WebEngine 等几个qtwebengine 用到的库。
3.4 安装
在qtwebengine 根目录下执行sudo make install
,生成的库会自动安装到/opt/qt5.12.7目录下。
4.配置开发环境
首先在软件商店中下载并安装QtCreator,安装完成之后配置QtVersion 、编译器、Kits等。可以参考这篇文章配置链接
5.测试
新建一个项目,运行测试。这里遇到一个问题,程序可正常编译运行,但是源码文件确报错 unexpected class name,这是因为缺少一个软件包,通过安装这个软件包解决了此问题,安装命令如下:
sudo apt-get install libclang-common-8-dev
安装完成后重启QtCreater,不会再出现上面的问题了。
6.程序无法输入中文的问题
经过查询发现是插件问题,自己编译的qt开发环境中缺少插件 libfcitxplatforminputcontextplugin.so,这里有两个办法解决这个问题,一个是下载源码自己编译该插件,另一个是在系统中找到这个插件,并拷贝到对应的插件目录中。这里采用第二种方式解决了该问题,如果第二种方式不能解决,那就尝试用第一种方式自己编译插件吧。
总结
从零开始搭建麒麟系统arm平台下的Qt开发环境还是挺折磨人的,在这个过程中会遇到很多新的问题,只有自己动手实践一遍才能真正体会。我把完整的qt环境上传到git上了,如果你也刚好需要而又不想折腾的话可以直接下载使用。下载地址:
以上就是本篇的所有内容了,欢迎评论区留言讨论!!!