国产化麒麟linux系统开发编译常见问题汇总
<h1>团队自研股票软件关注威信龚总号:QStockView,下载</h1><h1>1 问题处理</h1>
<h2>1.1 Unknown module in QT:QJsonDocument</h2>
<p>缺少QJsonDocument</p>
<p><img src="https://img2023.cnblogs.com/blog/1076976/202306/1076976-20230603150609122-1701451605.png"></p>
<p>解决方法:</p>
<p>Pro文件中加上 QT+=core;</p>
<p>播放器库问题</p>
<h2>1.2 代码中汉字乱码需要设置文件编码格式</h2>
<p> </p>
<p><img src="https://img2023.cnblogs.com/blog/1076976/202306/1076976-20230603150624848-354760337.png"></p>
<p>原因分析:</p>
<p>Window系统默认的文件格式是GBK,所以汉字可以直接显示;linux文件默认格式是UTF8,所以汉字显示乱码;</p>
<p>解决方法:</p>
<p>在QtCreator中,工具-选项-文本编辑器-行为将默认编码改成GBK,保存后,再关闭原来打开的文件(打开的还是原来的utf8,不会自动刷新),重新打开;中文就正常显示了;</p>
<p><img src="https://img2023.cnblogs.com/blog/1076976/202306/1076976-20230603150642266-1724989464.png"></p>
<h2>1.3 Ui文件无法编译问题</h2>
<p>no rule to make target *.ui needed by</p>
<p>解决办法:</p>
<p>缺少ui文件,复制添加ui文件;</p>
<p> </p>
<h2>1.4 覆盖关于moc_**.cpp的配方</h2>
<p> </p>
<p><img src="https://img2023.cnblogs.com/blog/1076976/202306/1076976-20230603150717694-1379876615.png"></p>
<p>原因分析:</p>
<p>因为有两个不同路径下的同名文件,需要被加入到pro中,生成makefile时会产生错误;所以要重命名一个文件;</p>
<p> </p>
<p><img src="https://img2023.cnblogs.com/blog/1076976/202306/1076976-20230603150735911-847524396.png"></p>
<p>解决办法</p>
<p>重命名其中的一个文件,然后修改引用命名,再重新编译;</p>
<h2>1.5 窗口句柄long转Qjsonvalue报错</h2>
<p>将long型的winid插入QjsonObject时,出现报错,conversion from long int to QJsonValue is ambiguous;windows系统下正常;</p>
<p align="left">QJsonObject root;</p>
<p align="left">root.insert("method", "getWndHandle");</p>
<p align="left">root.insert("componentID", "AnalysisCenter");</p>
<p align="left">QJsonObject data;</p>
<p align="left">long id = this->winId();</p>
<p align="left">data.insert("winId", id);</p>
<p>root.insert("data", data);</p>
<p>解决方法:</p>
<p>采用Quint64类型,并通过QVairiant进行转换;</p>
<p> </p>
<p><img src="https://img2023.cnblogs.com/blog/1076976/202306/1076976-20230603150813247-2138006287.png"></p>
<p> </p>
<h2>1.6 linux回调函数</h2>
<p> </p>
<p><img src="https://img2023.cnblogs.com/blog/1076976/202306/1076976-20230603150820963-238024688.png"></p>
<p>解决办法</p>
<p>Int __stdcall recvcallback(int type)</p>
<p>换成static __stdcall recvcallback(int type)</p>
<h2>1.7 goto 无法识别使用</h2>
<p><img src="https://img2023.cnblogs.com/blog/1076976/202306/1076976-20230603150837055-981628063.png"></p>
<p>解决办法:</p>
<p>采用do{}while(0)和break代替;</p>
<p> </p>
<h2>1.8 信号槽枚举用int传递编译错误</h2>
<p> </p>
<p><img src="https://img2023.cnblogs.com/blog/1076976/202306/1076976-20230603150852340-492609693.png"></p>
<p>Involid use of incomplete type </p>
<p>解决办法:</p>
<p>用int强制转换,并且包含#include<QVariant></p>
<p> </p>
<h2>1.9 linux QPrinter no such file or directory</h2>
<p>HUI报了QPrinter错误</p>
<p><img src="https://img2023.cnblogs.com/blog/1076976/202306/1076976-20230603150909875-331585720.png"></p>
<p align="center"> </p>
<p>解决办法:</p>
<p>在pro文件中添加 QT += printsupport</p>
<p> </p>
<h2>1.10 HUI编译报错 UI_*.h No such file or directory</h2>
<p> </p>
<p><img src="https://img2023.cnblogs.com/blog/1076976/202306/1076976-20230603150926963-689128874.png"></p>
<p>解决办法:</p>
<p>在pro文件中加入HUIControl/GeneratedFiles,这些ui_*.h文件是HUI库的一些界面ui文件编译生成后的文件;</p>
<h2>1.11 回调函数编译报错出现重复定义</h2>
<p><img src="https://img2023.cnblogs.com/blog/1076976/202306/1076976-20230603150940013-1603485871.png"></p>
<p>解决办法:</p>
<p>将回调函数设置为static静态函数;</p>
<p> </p>
<p><img src="https://img2023.cnblogs.com/blog/1076976/202306/1076976-20230603150954587-1370222604.png"></p>
<p> </p>
<h2>1.12 LibQtPrintSupport.so syntax error colloct2</h2>
<p>:error:ld returned 1 exsit status</p>
<p><img src="https://img2023.cnblogs.com/blog/1076976/202306/1076976-20230603151005875-1091239564.png"></p>
<p>报错原因:从windows下经过压缩处理,然后放到linux下,文件系统不一样,so文件结构被改变了</p>
<p>解决办法:</p>
<p>将HUI的压缩包放到麒麟linux系统下,然后用zip HUIControl.zip命令解压缩;</p>
<h2>1.13 “undefined reference to `vtable for ……..”</h2>
<p>QT中,类要支持信号与槽机制,需要继承自QObject并在头文件开头添加Q_OBJECT宏.如果使用QtCreator创建类时,没有选择继承自QObject类或其子类,而在创建后手工修改继承自QObject并手工添加Q_OBJECT宏,则在编译时有可能会出现"undefined reference to `vtable for’…"错误.</p>
<p>解决方法:</p>
<p>把新创建的类从项目中移除(注意不要从磁盘上删除),编译,然后再添加进工程,QtCreator就会重新解析此类,再编译就不再会出现上述错误。</p>
<p> </p>
<p>信号槽连接不能用</p>
<h2>1.14 Undefined reference to **showEvent()</h2>
<p>Undefined reference to **showEvent()</p>
<p><img src="https://img2023.cnblogs.com/blog/1076976/202306/1076976-20230603151024258-2024280762.png"></p>
<p>原因分析:</p>
<p>生成pro文件时包含了不需要的文件rangemonthview.h</p>
<p>解决办法:</p>
<p>在pro文件中找到并去掉就可以了;</p>
<h2>1.15 Multiple definition of ‘AddTaskItem’</h2>
<p>多重定义问题,也没有发现有其他定义;</p>
<p>解决办法:</p>
<p>将文件名和类名改成其他名字之后,再重新编译,解决问题;</p>
<p><img src="https://img2023.cnblogs.com/blog/1076976/202306/1076976-20230603151042794-1426324437.png"></p>
<p> 原因分析:AddTaskItem的头文件件没有加条件编译,或者名称重复定义;</p>
<p>解决办法:</p>
<p>加上条件编译或者将类名改个名字AddFileTaskItem</p>
<p>#ifndef AddTaskItem_H</p>
<p>#define AddTaskItem_H</p>
<p>……</p>
<p>#endif</p>
<h2>1.16 This application failed to start because it could not find or load the Qt platform plugin "xcb"</h2>
<p>nvmlInit Failed Graphics Memory May not abtain!</p>
<p>no nvmlDevice Found! Graphics Memory May not abtain</p>
<p>load libvaGLX failed!</p>
<p>hpr tls index{4}</p>
<p>This application failed to start because it could not find or load the Qt platform plugin "xcb"</p>
<p>in "".</p>
<p> </p>
<p>Available platform plugins are: xcb, eglfs, linuxfb, minimal, minimalegl, offscreen, vnc.</p>
<p> </p>
<p><img src="https://img2023.cnblogs.com/blog/1076976/202306/1076976-20230603151108025-638463654.png"></p>
<p> </p>
<p>Reinstalling the application may fix this problem.</p>
<p>已放弃</p>
<p><img src="https://img2023.cnblogs.com/blog/1076976/202306/1076976-20230603151155574-479748618.png"></p>
<p>原因分析:</p>
<p>缺少QT的依赖库,或者Qt依赖库的版本和系统的Qt版本不匹配;</p>
<p>解决办法:</p>
<p>(1) 将file:///opt/soft/Qt5.9.6/5.9.6/gcc_64/plugins目录下platforms文件夹复制到程序运行目录;</p>
<p> <img src="https://img2023.cnblogs.com/blog/1076976/202306/1076976-20230603151138825-1758668374.png"></p>
<p>(2) 使用自动打包脚本将xcb依赖的库文件复制到lib</p>
<p>终端执行命令:./copylib.sh libqxcb.so,生成lib文件夹,将lib文件夹内的lib文件复制到运行目录;</p>
<p><img src="https://img2023.cnblogs.com/blog/1076976/202306/1076976-20230603151229188-341872279.png"></p>
<p> </p>
<p>打包脚本如下所示:</p>
<p>#!/bin/bash</p>
<p> </p>
<p>LibDir=$PWD"/lib"</p>
<p>Target=$1</p>
<p> </p>
<p>lib_array=($(ldd $Target | grep -o "/.*" | grep -o "/.*/[^[:space:]]*"))</p>
<p> </p>
<p>$(mkdir $LibDir)</p>
<p> </p>
<p>for Variable in ${lib_array[@]}</p>
<p>do</p>
<p> cp "$Variable" $LibDir</p>
<p>done</p>
<p>#$</p>
<p> </p>
<p> </p>
<p>(3) 采用同样的方法的生成可执行程序的依赖库,然后也复制到运行目录;</p>
<p>(4) lib文件夹下面的有些库不能删除,这些事HUI依赖的库文件,如下图所示:</p>
<p><img src="https://img2023.cnblogs.com/blog/1076976/202306/1076976-20230603151323685-336439495.png"></p>
<p> </p>
<p>如果删除了这些文件,会报如下错误;</p>
<p> </p>
<p><img src="https://img2023.cnblogs.com/blog/1076976/202306/1076976-20230603151338573-64159740.png"></p>
<p> </p>
<h2>1.17 undefined symbol: _ZdlPvm, version Qt_5</h2>
<p>undefined symbol: _ZNK15QDateTimeParser5parseER7QStringRiRK9QDateTimeb, version Qt_5_PRIVATE_API (./libQt5Widgets.so.5)</p>
<p>undefined symbol: _ZN15QHighDpiScaling6originEPK7QScreen, version Qt_5_PRIVATE_API (./libQt5Widgets.so.5)</p>
<p>undefined symbol: _ZdaPvm, version Qt_5 (./libQt5Widgets.so.5)</p>
<p>undefined symbol: _ZN15QHighDpiScaling6factorEPK7QScreen, version Qt_5_PRIVATE_API (./libQt5Widgets.so.5)</p>
<p>undefined symbol: _ZN15QHighDpiScaling6factorEPK7QWindow, version Qt_5_PRIVATE_API (./libQt5Widgets.so.5)</p>
<p>undefined symbol: _ZdlPvm, version Qt_5 (./libQt5Widgets.so.5)</p>
<p>undefined symbol: _ZdlPvm, version Qt_5 (./libQt5PrintSupport.so.5)</p>
<p>undefined symbol: _ZdlPvm, version Qt_5 (./libQt5Sql.so.5)</p>
<p>undefined symbol: _ZdlPvm, version Qt_5 (./libQt5Svg.so.5)</p>
<p>undefined symbol: _ZdlPvm, version Qt_5 (./AnalysisCenter)</p>
<p>undefined symbol: _ZdaPvm, version Qt_5 (./AnalysisCenter)</p>
<p><img src="https://img2023.cnblogs.com/blog/1076976/202306/1076976-20230603151352721-736546006.png"></p>
<p>原因分析:</p>
<p>Qt安装的版本和系统使用的QT版本不一致,程序运行默认先从系统的file:///lib/x86_64-linux-gnu目录查找动态库,编译的使用了Qt5.9.6,而系统目录是Qt5.12.0的版本,所以会出现未定义的错误;不能替换系统目录下的Qt库,否则系统会崩溃(别问我怎么知道的);</p>
<p> </p>
<p>解决办法:</p>
<p>(1) 使用ldd –r AnalysisCenter 命令查看可执行程序的依赖库,是不是指向file:///lib/x86_64-linux-gnu;如果是,则说明程序运行引用的动态库是系统的Qt库,如果编译的QT库和系统不匹配,则会报错;</p>
<p>(2) 复制Qt5.9.6的库文件到运行目录,然后创建软连接libQtWidget.so.5 链接到运行目录的libQtWidget.so库;(我是直接将HUIDemo中的QT文件直接复制到运行目录,即可运行)</p>
<h2>1.18 failure to convert GBK to UTF-8</h2>
<p>converting to execution chatracter set invalid or incomplete multibyte or wide byte</p>
<p>cc1plus: error: failure to convert GBK to UTF-8</p>
<p> </p>
<p><img src="https://img2023.cnblogs.com/blog/1076976/202306/1076976-20230603151536005-1371339721.png"></p>
<p>界面出现乱码</p>
<p>使用file –b查看文件的编码格式;</p>
<p>file -b AddClusterTask.cpp</p>
<p>发现是ASCII编码,所以先要对文件编码格式进行转换,可以用iconv命令去转换文件编码格式;</p>
<p> </p>
<h2>1.19 No rule to make target</h2>
<p> </p>
<p>'AnalysisCenter_gch1.0.0/src/AddClusterTask', needed by 'GeneratedFiles/AddClusterTask.o'. Stop.</p>
<p><img src="https://img2023.cnblogs.com/blog/1076976/202306/1076976-20230603151610088-685089806.png"></p>
<p>原因分析:</p>
<p>文件没有找到</p>
<p>解决办法:</p>
<p>在pro文件中删除不存在或者删除的掉的文件;</p>
<p> </p>
<h2>1.20 界面上代码设置的汉字为乱码</h2>
<p>Ui文件中设置的汉字都可以正常显示,但是从VS2015复制过去的*.cpp文件中通过代买setText()设置的汉显示的都是乱码;如下图所示:</p>
<p><img src="https://img2023.cnblogs.com/blog/1076976/202306/1076976-20230603151629387-1415530954.png"> </p>
<p>原因分析:</p>
<p>VS2015默认的文件编码格式是ANSI(GBK)编码格式,而麒麟Linux默认的是UTF-8的文件编码格式,linux在编译的时候以UTF-8的格式去读取文件,导致中文乱码;</p>
<p>解决方法:</p>
<p>在Linux系统,将包含中文的文件的编码格式修改为UTF-8;</p>
<p>(1)查看文件编码格式</p>
<p>文件编码格式查看命令:file filename 查看文件编码</p>
<p>(2)修改文件的编码格式</p>
<p>1)在vim中使用 :set fileencoding= UTF-8 来转换文件的编码格式;</p>
<p>2)文件编码格式批量转换命令: find *.cpp -exec sh -c "iconv -f GBK -t UTF-8 {} > ./UTF8Temp/{}" \;</p>
<p>报错:find: 遗漏“-exec”的参数错误</p>
<p>是因为./UTF8Temp/{}" \;最后反斜杠之前少了空格,加个空格即可;</p>
<p><img src="https://img2023.cnblogs.com/blog/1076976/202306/1076976-20230603151718464-160816681.png"></p>
<p> </p>
<p>(3)再pro文件中加入编译参数</p>
<p>QMAKE_CXXFLAGS +=-finput-charset=UTF-8 -fexec-charset=utf-8</p>
<p><img src="https://img2023.cnblogs.com/blog/1076976/202306/1076976-20230603151732069-404660348.png"></p>
<p>(4)将转码后的文件替换到原来的文件,然后再重新编译;</p>
<p>会出现如下的错误,这个错误原因是文件中有些中文字符无法识别,导致无法转换,转换后的文件数据丢失,丢了一半;如果源文件格式不是GBK,则转换之后的文件只有3字节,所以先找到3字节的文件,用源文件替换;</p>
<p><img src="https://img2023.cnblogs.com/blog/1076976/202306/1076976-20230603151750950-227758467.png"></p>
<p>如果之前通过vim将文件格式改为utf-8,现在用批量命令去转,发现之前转为utf-8的AddClusterTask.cpp文件会出现转换失败,只有3字节的结束标志;所以要统一用批量命令去转;而且转换不能直接覆盖,要转码到UTF8Temp文件夹下,然后保存原cpp文件,然后再替换转换后文件;</p>
<p> </p>
<p><img src="https://img2023.cnblogs.com/blog/1076976/202306/1076976-20230603151804443-980594027.png"></p>
<p>用iconv命令转码的文件,有时会出现问题,只转了一半;后面的代码丢失了,导致无法编译通过;将有问题的文件通过vim 逐个设置格式;或者单独用iconv命令进行转换;iconv -f GBK -t UTF-8 main.cpp >./UTF8Temp/main.cpp;保障转换前后的文件大小相等;</p>
<p><img src="https://img2023.cnblogs.com/blog/1076976/202306/1076976-20230603151817680-1939159964.png"></p>
<h2>1.21 常量中有换行符错误</h2>
<p>将linux中编译通过的文件,复制到window系统vs2015中再次进行编译,发现会出现所有中文的地方都会报错“常量中有换行符错误”;</p>
<p>原因分析:</p>
<p>Linux中文件转换为了utf8编码,转到window中,默认的编码是GBK,所以中文位置会出现换行符;</p>
<p><img src="https://img2023.cnblogs.com/blog/1076976/202306/1076976-20230603151837008-2102987691.png"></p>
<p> </p>
<p>解决方法:</p>
<p>将文件保存为utf8 带标签格式;</p>
<p> </p>
<p> </p>
<h2>1.22 该字符在当前源字符集中无效</h2>
<p>warning C4828: 文件包含在偏移 0x13c9 处开始的字符,该字符在当前源字符集中无效(代码页 65001)。</p>
<p> </p>
<p><img src="https://img2023.cnblogs.com/blog/1076976/202306/1076976-20230603151908107-1665738096.png"></p>
<p>解决办法</p>
<p>可以下载转码工具</p>
<p>http://www.mind-pioneer.com/replace/page_download.html?http://www.mind-pioneer.com/replace/Download.html</p>
<p>批量将文件转码为utf-8 bom格式;并且将命令行参数/utf-8改为/execution-charset:utf-8。也就是执行字符集保存为u8,源文件不去要求utf8;</p>
<p><img src="https://img2023.cnblogs.com/blog/1076976/202306/1076976-20230603151922322-1694238003.png"></p>
<p> </p>
<h2>1.23 error LNK2005u*已经在*定义</h2>
<p>error LNK2005: SU_ControlWrite_HID 已经在 LicenseVerify.lib(SRUsbToken.obj) 中定义</p>
<p>原因分析</p>
<p>连接的时候会链接多个,链接器无法取舍;</p>
<p>解决方法</p>
<p>在链接器命令行加上/force:multiple ,意思是是出现多个,强制链接多个;</p>
<p> </p>
<p><img src="https://img2023.cnblogs.com/blog/1076976/202306/1076976-20230603151951345-975447187.png"></p>
<p> </p>
<h2>1.24 Linux和window同时兼容中文不乱码</h2>
<p>Linux中文不乱码的要求是文件采用utf8编码格式; QMAKE_CXXFLAGS +=-finput-charset=UTF-8 -fexec-charset=utf-8</p>
<p><img src="https://img2023.cnblogs.com/blog/1076976/202306/1076976-20230603152010025-1780732111.png"></p>
<p> </p>
<p>编译参数要加上window中文不乱码要求在每个源文件头部加上宏定义#pragma execution_character_set("utf-8"),或者在编译命令行中输入:/execution-charset:utf-8,若只需要修改源代码的编码,也可以只输入:/source-charset:utf-8</p>
<p>/utf-8相当于同时设置源代码和可执行文件。</p>
<p> </p>
<p>解决cpp,h文件全部采用utf8 bom编码格式;可以用vs2015的高级保存选项,也可以用批量转码工具转测utf8bom;linux的编译命令参数加上QMAKE_CXXFLAGS +=-finput-charset=UTF-8 -fexec-charset=utf-8。这样在Linux环境下就可以实现中文显示;在vs2015代码中有设置中文的cpp文件中加入宏定义#pragma execution_character_set("utf-8"),或者在编译命令行中输入:/execution-charset:utf-8,</p>
<p> </p>
<p> </p>
<h2>1.25 Could not connect to any X display</h2>
<p>麒麟系统中执行./AnalysisCenter出现无法打开桌面应用,安装图形桌面后,Linux通过终端命令无法启动图形应用,报错“Could not connect to any X display.”或“Gtk-WARNING **: 10:49:06.625: cannot open display: :0”等。</p>
<p>是因为用户没有显示权限,需要执行命令xhost获取可以访问当前主机上的增强 X-Windows显示权限,之后就可以打开了;</p>
<p><img src="https://img2023.cnblogs.com/blog/1076976/202306/1076976-20230603152033375-1669178994.png"></p>
<p> </p>
<h2>1.26 执行软件报权限不够错误</h2>
<p>银河麒麟系统安装后,没有可执行权限,运行bash或者二进制程序都提示bash权限不够或者类似报错</p>
<p><img src="https://img2023.cnblogs.com/blog/1076976/202306/1076976-20230603152123961-953339415.png"></p>
<p> </p>
<p>解决方法</p>
<p>执行sudo setstatus softmode -p 即可,如下图所示:</p>
<p>sudo setstatus softmode -p</p>
<h2>1.27 设置透明和阴影的窗口变成了黑色</h2>
<p>为了实现弹出窗口边框周围带阴影的效果;采用外层设置透明,内层边缘显示阴影;代码如下。但是在window下可以,在麒麟系统中,透明部分的窗口直接变为黑色;setAttribute(Qt::WA_TranslucentBackground);不生效了;</p>
<p align="left">setWindowModality(Qt::ApplicationModal);</p>
<p align="left"> setWindowFlags(Qt::FramelessWindowHint|Qt::WindowStaysOnTopHint | Qt::SubWindow);</p>
<p align="left"> </p>
<p align="left"> setAttribute(Qt::WA_TranslucentBackground); //背景透明</p>
<p align="left"> //边框阴影效果</p>
<p align="left"> m_ShadowEffect = new QGraphicsDropShadowEffect(ui.widget);</p>
<p align="left"> m_ShadowEffect->setBlurRadius(34);</p>
<p align="left"> m_ShadowEffect->setColor(QColor(0, 0, 0, 51));</p>
<p align="left"> m_ShadowEffect->setOffset(0, 12);</p>
<p align="left"> ui.widget->setGraphicsEffect(m_ShadowEffect);</p>
<p> setFocusPolicy(Qt::StrongFocus);</p>
<p> </p>
<p><img src="https://img2023.cnblogs.com/blog/1076976/202306/1076976-20230603152214366-8538186.png"></p>
<p><img src="https://img2023.cnblogs.com/blog/1076976/202306/1076976-20230603152221238-1656127415.png"></p>
<p>解决方法:</p>
<p>是因为使用的麒麟系统不支持透明阴影等渲染效果,需要安装一个软件xcompmgr。Xcompmgr是一个简单的混合窗口管理器,可以实现阴影、原生窗口透明(配合transset工具)等特效。Xcompmgr设计初衷只是实现混合窗口管理器的概念,所以比起同类混合窗口管理器如 Compiz Fusion,Xcompmgr轻量许多。Xcompmgr不替代任何窗口管理器,所以对于Openbox和Fluxbox这类缺乏特效的窗口管理器来讲,配合Xcompmgr能得到更华丽的视觉效果。</p>
<p>执行如下命令安装软件</p>
<p>sudo apt-get install xcompmgr</p>
<p>然后再输入xcompmgr ,启动xcompmgr(关闭终端);</p>
<p><img src="https://img2023.cnblogs.com/blog/1076976/202306/1076976-20230603152242252-711507517.png"></p>
<p>或者设置xcompmgr开机自启动</p>
<p> </p>
<p>再次打开程序, 就可以正常显示了;</p>
<p> </p>
<p><img src="https://img2023.cnblogs.com/blog/1076976/202306/1076976-20230603152255984-861068393.png"></p>
<p> </p>
<h2>1.28 字节对齐方式不同导致协议发送解析错误</h2>
<p>通过Socket TCP发送消息,实现进程间的通讯,突然消息解析报错 ,协议头的结构体的长度不一致;</p>
<p>例如下面的的结构定义,在window系统中,结构体大小是12字节;但是在 linux系统中,是以最大的变量长度对齐,最大的是unsigned long 4字节,所以结构体的大小是4*4+4+4=24字节;</p>
<p align="left">struct msg_header</p>
<p align="left">{</p>
<p align="left"> char head;</p>
<p align="left"> unsigned long pack_len;</p>
<p align="left"> int code;</p>
<p align="left"> msg_header()</p>
<p align="left"> {</p>
<p align="left"> head = 'H';</p>
<p align="left"> head = 'K';</p>
<p align="left"> head = 'P';</p>
<p align="left"> head = '&';</p>
<p align="left"> }</p>
<p align="left">};</p>
<p>解决方法</p>
<p>为了实现同样是16字节,需要在结构体定义中加上#pragma pack(push,1);表示按照1字节对齐; #pragma pack()则是取消字节对齐设置,避免对其他的结构体造成影响;</p>
<p align="left">//协议头对齐方式</p>
<p align="left">#pragma pack(push,1)</p>
<p align="left">struct msg_header</p>
<p align="left">{</p>
<p align="left"> char head;</p>
<p align="left"> unsigned long pack_len;</p>
<p align="left"> int code;</p>
<p align="left"> msg_header()</p>
<p align="left"> {</p>
<p align="left"> head = 'H';</p>
<p align="left"> head = 'K';</p>
<p align="left"> head = 'P';</p>
<p align="left"> head = '&';</p>
<p align="left"> }</p>
<p align="left">};</p>
<p>#pragma pack()//取消对齐,避免对其他造成影响</p>
<h2>1.29 Ssh无法连接服务</h2>
<p>没有安装或者驱动ssh服务</p>
<h3>1.29.1 安装</h3>
<p>sudo yum install sshd</p>
<p>sudo yum install openssh-server</p>
<p> </p>
<p>sudo apt-get install sshd</p>
<p>sudo apt-get install openssh-server</p>
<h3>1.29.2 启动</h3>
<p>sudo service ssh start</p>
<h2>1.30 Qtcreator Could not determine which "make"</h2>
<p>重新安装了麒麟系统,安装了QtCreator之后,原先可以正常编译的工程,突然不能编译了;报错如下</p>
<p>20:28:00: Could not determine which "make" command to run. Check the "make" step in the build configuration.</p>
<p>Error while building/deploying project AnalysisCenter (kit: Desktop Qt 5.9.6 GCC 64bit)</p>
<p>When executing step "qmake"</p>
<p>原因分析:</p>
<p>缺少了G++编译器;</p>
<p>解决方法:</p>
<p>安装G++编译器,充电线USB插到PC设备上面,手机去设置-》USB共享网络-》USB共享网络;执行sudo apt-get install build-essential</p>
<p>或者下载G++软件包去安装:build-essential_12.8kylin1_amd64.deb</p>
</div>
<div id="MySignature" role="contentinfo">
自己开发了一个股票智能分析软件,功能很强大,需要的关注微信公众号:QStockView<br><br>
来源:https://www.cnblogs.com/bclshuai/p/17454053.html
頁:
[1]