工作中会遇到这样一种情况:qt应用程序在运行时提示找不到某个qt的动态库。我遇到的是缺少libQt5Websocket.so,因为应用程序是在x86平台+银河麒麟v10上开发,能够正常编译运行,然后移植到rk3588(aarch64架构)上+银河麒麟v10时却报错找不到libQt5Websocket.so。

在rk3588+麒麟v10编译过程中遇到报错:

遇到这种情况百思不得其解,后来经过查证才知道以下几点:

  • 麒麟v10系统默认安装的qt是不完整的,有些子模块并没有安装,例如我遇到的问题是websocket模块并没有安装,而自己的项目中正好使用该模块
  • 默认安装的qt在麒麟v10系统下库文件一般在/usr/lib/aarch64-linux-gnu,头文件一般在/usr/include/aarch64-linux-gnu/qt5下。对于已经安装的动态库来说功能正常,但是对于缺少某个模块需要单独编译时存在缺少头文件的情况,上面的例子就是证明。

编译子模块

  1. 到qt网站下载对应版本的子模块源码,下载网址:Index of /​download.qt.io,按照下图的顺序下载想要编译的子模块即可。

Qt之submodule编译-LMLPHPQt之submodule编译-LMLPHPQt之submodule编译-LMLPHP

2. 下载到本地解压,通过执行以下命令完成编译

sudo apt-get install qtbase5-private-dev
cd 源码目录
qmake 
make
make install

或者通过qtcreator打开子模块源码目录,然后进行编译,但是需要注意的是在编译之前一定要执行下面的命令,否则就会报前面的错误。

sudo apt-get install qtbase5-private-dev

执行完该命令后,该命令会在qt默认目录/usr/include/aarch64-linux-gnu/qt5下安装一系列头文件,其中就包括本文前面提到的缺少qobject_p.h头文件的错误。

这里提一下qtbase5-private-dev命令会安装哪些文件,如下所示:

使用子模块

编译完成的子模块会在源码目录下生成一个lib目录,生成的文件会拷贝该该目录下,包含动态库文件和pkconfig相关文件,图示如下:

Qt之submodule编译-LMLPHP

 通过linux提供的拷贝命令将动态库文件拷贝到qt的安装目录

sudo cp libQt5WebSockets.* /usr/lib/aarch64-linux-gnu

同时将pkconfig下的pc文件拷贝至/usr/lib/aarch64-linux-gnu/pkgconfig目录下

Qt之submodule编译-LMLPHP

 至此单独编译qtwebsocket子模块完成。

总结

通过这个问题我们学到了什么呢?

1、系统默认的安装你的qt并不是完整的,有些模块默认并没有安装

2、单独编译子模块时,需要执行一些命令将编译qt过程中的一些依赖项安装一下,例如安装qtbase5-private-dev

参考链接:

麒麟V10上编译qtwebsockets时报错。 fatal error: QtWebSockets/qwebsockets_global.h。qwebsocket_p.h:65:10: fatal等-CSDN博客

10-14 18:57