做项目时要求,要求做一个用于QT客户端更新提供更新的服务器,服务器弄好啦,要测试一下,在发布时,发现了一些问题,在此记录一下。
这个打包和我的前一篇博客步骤一样,打包可参考https://blog.csdn.net/qq_44667165/article/details/127609929
打包好后,我把服务程序上传到我的阿里云服务器上,我的云服务器是ubantu20.04的命令行界面,内存只有2G,没有图形界面,比较轻便,没有图形界面,系统资源的消耗小,所以一般服务器不搞图形界面,方便远程命令操控
然后我在云服务器上运行时,提示
Could not load the Qt platform plugin "xcb" in "" even though it was found
这是什么意思呢?
我查了一下,xcb在Qt里是图形界面必须要加载的模块,这里卡了我,一时没有头绪,因为我的服务器是没有加载图形界面的,怎么会这样呢?
后面想了想,既然需要图形模块来加载的话,应该但是我的服务器没有图形界面,加载不了可执行程序里面要依赖的图形库,也就是GUI界面。
我去打包的lib目录看了一下
看到33个库文件,有几个我熟悉的GUI库文件,XCB,Widget,其他的不怎么认识,肯定还有,因为加载图形界面是比较耗资源的,需要很多库的协同加载
为什么有那么多图形库呢,想到这里,我就去我的源代码那里看了下,去Qt的.pro文件看了看,虽然我有QT -= gui的配置,但是认真看了下,还有这个 QT += widgets,这个就是图形模块了,注释了之后,程序也报错了
QApppliCation是需要GUI支持的,关系如下
QApplication继承了QGuiApplication类,而QGuiApplication继承了QCoreApplication类,而QCoreApplication又继承QObject的
QCoreApplication定义在core模块中,为应用程序提供了一个非gui的事件循环,QGuiApplication定义在gui模块中,提供了额外的gui相关的设置,比如桌面设置,风格,字体,调色板,剪切板,光标;QApplication定义在widgets模块中,是QWidget相关的,能设置双击间隔,按键间隔,拖拽距离和时间,滚轮滚动行数等,能获取桌面,激活的窗口,模式控件,弹跳控件等
到此原因就很明朗了,把有关GUI的模块全部去掉即可,使用纯命令行模式的QCoreApplication即可,
这样子,然后重新编译,把之前打包好的文件全部删掉,重新打包一遍
然后再次进入到打包好的lib目录下:
此时只有14个库文件了,之前有GUI的有33个库文件,少了一倍多,当然程序打包时,大小也少了查不多一倍。所以服务器为什么不搞GUI的原因之一,耗资源
重新上传服务器,配置好,就没有问题了,运行,没有报错了,搞定!!!
服务器一般只搞命令行界面的,里面除了程序外,日志模块必不可少,各种类型的日志文件是排查程序问题的重要途径。服务器一般部署在一个独立的主机上,可以随时ssh等方式远程控制。