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

系统版本

root@hg-TR3250:/home/thirdlib/qtwebsockets-5.12# cat /etc/os-release 
NAME="Kylin"
VERSION="银河麒麟桌面操作系统(国防版)V10"
VERSION_US="Kylin Linux Desktop (GFB)V10"
ID=kylin
ID_LIKE=debian
PRETTY_NAME="Kylin V10 (国防版)"
VERSION_ID="v10"
HOME_URL="http://www.kylinos.cn/"
SUPPORT_URL="http://www.kylinos.cn/support/technology.html"
BUG_REPORT_URL="http://www.kylinos.cn/"
PRIVACY_POLICY_URL="http://www.kylinos.cn"
VERSION_CODENAME=kylin
UBUNTU_CODENAME=kylin
PROJECT_CODENAME=v10

cpu架构

root@hg-TR3250:/home/thirdlib/qtwebsockets-5.12# arch
aarch64


说明:V10自带了qt5.12.8。


麒麟V10上编译qtwebsockets时报错。 fatal error: QtWebSockets/qwebsockets_global.h。qwebsocket_p.h:65:10: fatal等_第1张图片
麒麟V10上编译qtwebsockets时报错。 fatal error: QtWebSockets/qwebsockets_global.h。qwebsocket_p.h:65:10: fatal等_第2张图片
由此可见,自带的qt5.12.8并没有安装 qtwebsockets 模块。


下载 qtwebsockets 5.12版本:https://github.com/qt/qtwebsockets/tree/5.12

解压执行qmake qtwebsockets.pro;
然后执行make,此时报错,如下所示。

root@hg-TR3250:/home/thirdlib/qtwebsockets-5.12# make
cd src/ && ( test -e Makefile || /usr/lib/qt5/bin/qmake -o Makefile /home/thirdlib/qtwebsockets-5.12/src/src.pro ) && make -f Makefile 
make[1]: 进入目录“/home/thirdlib/qtwebsockets-5.12/src”
cd websockets/ && ( test -e Makefile || /usr/lib/qt5/bin/qmake -o Makefile /home/thirdlib/qtwebsockets-5.12/src/websockets/websockets.pro ) && make -f Makefile 
make[2]: 进入目录“/home/thirdlib/qtwebsockets-5.12/src/websockets”
perl /usr/lib/aarch64-linux-gnu/qt5/mkspecs/features/data/unix/findclasslist.pl < QtWebSockets.version.in > QtWebSockets.version
g++ -c -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -O2 -std=c++1z -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -Wall -W -Wvla -Wdate-time -Wshift-overflow=2 -Wduplicated-cond -Wno-stringop-overflow -Wno-deprecated-copy -Wno-redundant-move -Wno-format-overflow -Wno-init-list-lifetime -D_REENTRANT -fPIC -DQT_NO_FOREACH -DQT_NO_NARROWING_CONVERSIONS_IN_CONNECT -DQT_BUILD_WEBSOCKETS_LIB -DQT_BUILDING_QT -DQT_NO_CAST_TO_ASCII -DQT_ASCII_CAST_WARNINGS -DQT_MOC_COMPAT -DQT_USE_QSTRINGBUILDER -DQT_DEPRECATED_WARNINGS -DQT_DISABLE_DEPRECATED_BEFORE=0x050000 -DQT_NO_EXCEPTIONS -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE -DQT_NO_DEBUG -DQT_NETWORK_LIB -DQT_CORE_LIB -I. -I../../include -I../../include/QtWebSockets -I/home/thirdlib/qtwebsockets-5.12/include/QtWebSockets/5.12.12 -I/home/thirdlib/qtwebsockets-5.12/include/QtWebSockets/5.12.12/QtWebSockets -isystem /usr/include/aarch64-linux-gnu/qt5/QtCore/5.12.8 -isystem /usr/include/aarch64-linux-gnu/qt5/QtCore/5.12.8/QtCore -isystem /usr/include/aarch64-linux-gnu/qt5 -isystem /usr/include/aarch64-linux-gnu/qt5/QtNetwork -isystem /usr/include/aarch64-linux-gnu/qt5/QtCore -I.moc -I/usr/lib/aarch64-linux-gnu/qt5/mkspecs/linux-g++ -o .obj/qwebsocket.o qwebsocket.cpp
In file included from qwebsocket.cpp:272:
qwebsocket.h:53:10: fatal error: QtWebSockets/qwebsockets_global.h: 没有那个文件或目录
   53 | #include "QtWebSockets/qwebsockets_global.h"
      |          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
make[2]: *** [Makefile:511.obj/qwebsocket.o] 错误 1
make[2]: 离开目录“/home/thirdlib/qtwebsockets-5.12/src/websockets”
make[1]: *** [Makefile:48:sub-websockets-make_first-ordered] 错误 2
make[1]: 离开目录“/home/thirdlib/qtwebsockets-5.12/src”
make: *** [Makefile:49:sub-src-make_first] 错误 2

将源码 xxx/src/websockets 目录下的所有头文件中的QtWebSockets/给去掉,直接设置为当前路径即可。

麒麟V10上编译qtwebsockets时报错。 fatal error: QtWebSockets/qwebsockets_global.h。qwebsocket_p.h:65:10: fatal等_第3张图片

修改后(注意:源码src下的所有头文件都需要按此炮制)
麒麟V10上编译qtwebsockets时报错。 fatal error: QtWebSockets/qwebsockets_global.h。qwebsocket_p.h:65:10: fatal等_第4张图片

make clean,再次make,此时发现之前的错已经不报了,但是又来了一个新的错误,如下。

root@hg-TR3250:/home/thirdlib/qtwebsockets-5.12# make
cd src/ && ( test -e Makefile || /usr/lib/qt5/bin/qmake -o Makefile /home/thirdlib/qtwebsockets-5.12/src/src.pro ) && make -f Makefile 
make[1]: 进入目录“/home/thirdlib/qtwebsockets-5.12/src”
cd websockets/ && ( test -e Makefile || /usr/lib/qt5/bin/qmake -o Makefile /home/thirdlib/qtwebsockets-5.12/src/websockets/websockets.pro ) && make -f Makefile 
make[2]: 进入目录“/home/thirdlib/qtwebsockets-5.12/src/websockets”
perl /usr/lib/aarch64-linux-gnu/qt5/mkspecs/features/data/unix/findclasslist.pl < QtWebSockets.version.in > QtWebSockets.version
g++ -c -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -O2 -std=c++1z -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -Wall -W -Wvla -Wdate-time -Wshift-overflow=2 -Wduplicated-cond -Wno-stringop-overflow -Wno-deprecated-copy -Wno-redundant-move -Wno-format-overflow -Wno-init-list-lifetime -D_REENTRANT -fPIC -DQT_NO_FOREACH -DQT_NO_NARROWING_CONVERSIONS_IN_CONNECT -DQT_BUILD_WEBSOCKETS_LIB -DQT_BUILDING_QT -DQT_NO_CAST_TO_ASCII -DQT_ASCII_CAST_WARNINGS -DQT_MOC_COMPAT -DQT_USE_QSTRINGBUILDER -DQT_DEPRECATED_WARNINGS -DQT_DISABLE_DEPRECATED_BEFORE=0x050000 -DQT_NO_EXCEPTIONS -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE -DQT_NO_DEBUG -DQT_NETWORK_LIB -DQT_CORE_LIB -I. -I../../include -I../../include/QtWebSockets -I/home/thirdlib/qtwebsockets-5.12/include/QtWebSockets/5.12.12 -I/home/thirdlib/qtwebsockets-5.12/include/QtWebSockets/5.12.12/QtWebSockets -isystem /usr/include/aarch64-linux-gnu/qt5/QtCore/5.12.8 -isystem /usr/include/aarch64-linux-gnu/qt5/QtCore/5.12.8/QtCore -isystem /usr/include/aarch64-linux-gnu/qt5 -isystem /usr/include/aarch64-linux-gnu/qt5/QtNetwork -isystem /usr/include/aarch64-linux-gnu/qt5/QtCore -I.moc -I/usr/lib/aarch64-linux-gnu/qt5/mkspecs/linux-g++ -o .obj/qwebsocket.o qwebsocket.cpp
In file included from qwebsocket.cpp:273:
qwebsocket_p.h:65:10: fatal error: private/qobject_p.h: 没有那个文件或目录
   65 | #include 
      |          ^~~~~~~~~~~~~~~~~~~~~
compilation terminated.
make[2]: *** [Makefile:519:.obj/qwebsocket.o] 错误 1
make[2]: 离开目录“/home/thirdlib/qtwebsockets-5.12/src/websockets”
make[1]: *** [Makefile:48:sub-websockets-make_first-ordered] 错误 2
make[1]: 离开目录“/home/thirdlib/qtwebsockets-5.12/src”
make: *** [Makefile:49:sub-src-make_first] 错误 2

由报错可知,是缺少 private/qobjec_p.h文件了。。


我们在其他机器上搜索该文件,看看是个什么东西。。

麒麟V10上编译qtwebsockets时报错。 fatal error: QtWebSockets/qwebsockets_global.h。qwebsocket_p.h:65:10: fatal等_第5张图片

麒麟V10上编译qtwebsockets时报错。 fatal error: QtWebSockets/qwebsockets_global.h。qwebsocket_p.h:65:10: fatal等_第6张图片

很明显,qt每个模块下的都有private目录,而该文件就在这个目录当中。。。


再来看看我们机器上的,是个啥情况???
麒麟V10上编译qtwebsockets时报错。 fatal error: QtWebSockets/qwebsockets_global.h。qwebsocket_p.h:65:10: fatal等_第7张图片
我们的机器没有privete目录,,,,,

解决方案

这是因为缺少了库,,qtbase5-private-dev。

安装它,apt install qtbase5-private-dev

麒麟V10上编译qtwebsockets时报错。 fatal error: QtWebSockets/qwebsockets_global.h。qwebsocket_p.h:65:10: fatal等_第8张图片

安装完毕,private已经存在了,,qobjec_p.h文件也存在了。。。
在这里插入图片描述


此时clean,然后make,之前的错没有了,但是又报了新的错误了,如下所示。

make[2]: 离开目录“/home/thirdlib/qtwebsockets-5.12/src/websockets”
cd imports/ && ( test -e Makefile || /usr/lib/qt5/bin/qmake -o Makefile /home/thirdlib/qtwebsockets-5.12/src/imports/imports.pro ) && make -f Makefile 
make[2]: 进入目录“/home/thirdlib/qtwebsockets-5.12/src/imports”
cd qmlwebsockets/ && ( test -e Makefile || /usr/lib/qt5/bin/qmake -o Makefile /home/thirdlib/qtwebsockets-5.12/src/imports/qmlwebsockets/qmlwebsockets.pro ) && make -f Makefile 
Project ERROR: Unknown module(s) in QT: qml-private
make[2]: *** [Makefile:48:sub-qmlwebsockets-make_first] 错误 3
make[2]: 离开目录“/home/thirdlib/qtwebsockets-5.12/src/imports”
make[1]: *** [Makefile:91:sub-imports-make_first-ordered] 错误 2
make[1]: 离开目录“/home/thirdlib/qtwebsockets-5.12/src”
make: *** [Makefile:49:sub-src-make_first] 错误 2

好,此时执行命令:
apt install qtdeclarative5-dev
apt-get install qtdeclarative5-private-dev

接着clean、make。。。


此时报错如下:

rm -f ../../lib/libQt5WebSockets.so.5.12
mv -f libQt5WebSockets.so ../../lib/libQt5WebSockets.so
mv -f libQt5WebSockets.so.5 ../../lib/libQt5WebSockets.so.5
mv -f libQt5WebSockets.so.5.12 ../../lib/libQt5WebSockets.so.5.12
make[2]: 离开目录“/home/thirdlib/qtwebsockets-5.12/src/websockets”
cd imports/ && ( test -e Makefile || /usr/lib/qt5/bin/qmake -o Makefile /home/thirdlib/qtwebsockets-5.12/src/imports/imports.pro ) && make -f Makefile 
make[2]: 进入目录“/home/thirdlib/qtwebsockets-5.12/src/imports”
cd qmlwebsockets/ && ( test -e Makefile || /usr/lib/qt5/bin/qmake -o Makefile /home/thirdlib/qtwebsockets-5.12/src/imports/qmlwebsockets/qmlwebsockets.pro ) && make -f Makefile 
make[3]: 进入目录“/home/thirdlib/qtwebsockets-5.12/src/imports/qmlwebsockets”
/usr/lib/qt5/bin/qmake -install qinstall qmldir ../../../qml/QtWebSockets/qmldir
/usr/lib/qt5/bin/qmake -install qinstall plugins.qmltypes ../../../qml/QtWebSockets/plugins.qmltypes
g++ -c -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -O2 -std=c++1z -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -Wall -W -Wvla -Wdate-time -Wshift-overflow=2 -Wduplicated-cond -Wno-stringop-overflow -Wno-deprecated-copy -Wno-redundant-move -Wno-format-overflow -Wno-init-list-lifetime -D_REENTRANT -fPIC -DQT_NO_FOREACH -DQT_NO_NARROWING_CONVERSIONS_IN_CONNECT -DQT_NO_EXCEPTIONS -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE -DQT_NO_DEBUG -DQT_PLUGIN -DQT_WEBSOCKETS_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -I. -I../../../include -I../../../include/QtWebSockets -isystem /usr/include/aarch64-linux-gnu/qt5/QtQml/5.12.8 -isystem /usr/include/aarch64-linux-gnu/qt5/QtQml/5.12.8/QtQml -isystem /usr/include/aarch64-linux-gnu/qt5 -isystem /usr/include/aarch64-linux-gnu/qt5/QtQml -isystem /usr/include/aarch64-linux-gnu/qt5/QtNetwork -isystem /usr/include/aarch64-linux-gnu/qt5/QtCore/5.12.8 -isystem /usr/include/aarch64-linux-gnu/qt5/QtCore/5.12.8/QtCore -isystem /usr/include/aarch64-linux-gnu/qt5/QtCore -I.moc -I/usr/lib/aarch64-linux-gnu/qt5/mkspecs/linux-g++ -o .obj/qmlwebsockets_plugin.o qmlwebsockets_plugin.cpp
In file included from qmlwebsockets_plugin.cpp:44:
qqmlwebsocket.h:47:10: fatal error: QtWebSockets/QWebSocket: 没有那个文件或目录
   47 | #include 
      |          ^~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
make[3]: *** [Makefile:423:.obj/qmlwebsockets_plugin.o] 错误 1
make[3]: 离开目录“/home/thirdlib/qtwebsockets-5.12/src/imports/qmlwebsockets”
make[2]: *** [Makefile:48:sub-qmlwebsockets-make_first] 错误 2
make[2]: 离开目录“/home/thirdlib/qtwebsockets-5.12/src/imports”
make[1]: *** [Makefile:91:sub-imports-make_first-ordered] 错误 2
make[1]: 离开目录“/home/thirdlib/qtwebsockets-5.12/src”
make: *** [Makefile:49:sub-src-make_first] 错误 2

root@hg-TR3250:/home/thirdlib/qtwebsockets-5.12# cat src/src.pro 
TEMPLATE = subdirs
CONFIG += ordered

qtConfig(textcodec) {
    SUBDIRS += websockets
    qtHaveModule(quick): SUBDIRS += imports
}


直接修改 src.pro,将 qtHaveModule(quick): SUBDIRS += imports 行直接去了。。
也就是说,将来在qml中是不能使用websockets的,,只能在QtWidgets中使用。。。

麒麟V10上编译qtwebsockets时报错。 fatal error: QtWebSockets/qwebsockets_global.h。qwebsocket_p.h:65:10: fatal等_第9张图片

此时clean,再次make。。又报错了。。如下所示。。。

make[3]: 进入目录“/home/thirdlib/qtwebsockets-5.12/examples/websockets/echoclient”
g++ -c -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -O2 -fno-exceptions -Wall -W -D_REENTRANT -fPIC -DQT_NO_FOREACH -DQT_NO_EXCEPTIONS -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE -DQT_NO_DEBUG -DQT_WEBSOCKETS_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -I. -I../../../include -I../../../include/QtWebSockets -isystem /usr/include/aarch64-linux-gnu/qt5 -isystem /usr/include/aarch64-linux-gnu/qt5/QtNetwork -isystem /usr/include/aarch64-linux-gnu/qt5/QtCore -I.moc -I/usr/lib/aarch64-linux-gnu/qt5/mkspecs/linux-g++ -o .obj/main.o main.cpp
In file included from main.cpp:53:
echoclient.h:54:10: fatal error: QtWebSockets/QWebSocket: 没有那个文件或目录
   54 | #include 
      |          ^~~~~~~~~~~~~~~~~~~~~~~~~

root@hg-TR3250:/home/thirdlib/qtwebsockets-5.12# cat examples/examples.pro 
TEMPLATE = subdirs

SUBDIRS = websockets

修改examples.pro,将其中的 SUBDIRS = websockets中的websockets去掉。
麒麟V10上编译qtwebsockets时报错。 fatal error: QtWebSockets/qwebsockets_global.h。qwebsocket_p.h:65:10: fatal等_第10张图片

编译成功

最终编译成功。

麒麟V10上编译qtwebsockets时报错。 fatal error: QtWebSockets/qwebsockets_global.h。qwebsocket_p.h:65:10: fatal等_第11张图片

安装

root@hg-TR3250:/home/thirdlib/qtwebsockets-5.12# make install
cd src/ && ( test -e Makefile || /usr/lib/qt5/bin/qmake -o Makefile /home/thirdlib/qtwebsockets-5.12/src/src.pro ) && make -f Makefile install
make[1]: 进入目录“/home/thirdlib/qtwebsockets-5.12/src”
cd websockets/ && ( test -e Makefile || /usr/lib/qt5/bin/qmake -o Makefile /home/thirdlib/qtwebsockets-5.12/src/websockets/websockets.pro ) && make -f Makefile install
make[2]: 进入目录“/home/thirdlib/qtwebsockets-5.12/src/websockets”
/usr/lib/qt5/bin/qmake -install qinstall -exe ../../lib/libQt5WebSockets.so.5.12.12 
...

至此,安装完毕。。。

麒麟V10上编译qtwebsockets时报错。 fatal error: QtWebSockets/qwebsockets_global.h。qwebsocket_p.h:65:10: fatal等_第12张图片
和第一张图相比较,可以看出,确实新增了QtWebSockets模块了,,,证明已经安装成功了。。。。

demo测试

此时,qtcreator中创建demo测试,首先pro文件中添加 QT += websockets。
然后.cpp中 #include 报错。。。也就是没这个头文件。。

结果发现安装的目录下没有文件,,,,
麒麟V10上编译qtwebsockets时报错。 fatal error: QtWebSockets/qwebsockets_global.h。qwebsocket_p.h:65:10: fatal等_第13张图片
好,去源码下将头文件拷过来,,,

麒麟V10上编译qtwebsockets时报错。 fatal error: QtWebSockets/qwebsockets_global.h。qwebsocket_p.h:65:10: fatal等_第14张图片

websocket在线测试工具:http://www.jsons.cn/websocket/

我们自己通过qt的websocket去创建一个服务器,然后用工具充当客户端去连接服务器。然后进行双向通信交互。

#include "MainWindow.h"
#include "ui_MainWindow.h"
#include 

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);


    m_server = new QWebSocketServer(QString(""), QWebSocketServer::NonSecureMode, this);
    m_server->listen(QHostAddress::Any, 8888);
    connect(m_server, &QWebSocketServer::newConnection, this, [=] {
        if(m_server->hasPendingConnections()) {
            m_socket = m_server->nextPendingConnection();
            qDebug() << "new connection:> " << m_socket->peerAddress().toString() << ":" << m_socket->peerPort();
            connect(m_socket, &QWebSocket::textMessageReceived, this, [=](QString msg) {
               qDebug() << "receive msg:> " << msg;
            });
            connect(m_socket, &QWebSocket::disconnected, this, [] {
                qDebug() << "disconnectd";
            });
        }
    });
}

MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::on_pushButton_clicked()
{
    m_socket->sendTextMessage(QString("HelloWorld."));
}

麒麟V10上编译qtwebsockets时报错。 fatal error: QtWebSockets/qwebsockets_global.h。qwebsocket_p.h:65:10: fatal等_第15张图片

你可能感兴趣的:(#,QT开发经验,qt,麒麟V10)