赞
踩
缺少QJsonDocument
解决方法:
Pro文件中加上 QT+=core;
播放器库问题
原因分析:
Window系统默认的文件格式是GBK,所以汉字可以直接显示;linux文件默认格式是UTF8,所以汉字显示乱码;
解决方法:
在QtCreator中,工具-选项-文本编辑器-行为将默认编码改成GBK,保存后,再关闭原来打开的文件(打开的还是原来的utf8,不会自动刷新),重新打开;中文就正常显示了;
no rule to make target *.ui needed by
解决办法:
缺少ui文件,复制添加ui文件;
原因分析:
因为有两个不同路径下的同名文件,需要被加入到pro中,生成makefile时会产生错误;所以要重命名一个文件;
解决办法
重命名其中的一个文件,然后修改引用命名,再重新编译;
将long型的winid插入QjsonObject时,出现报错,conversion from long int to QJsonValue is ambiguous;windows系统下正常;
QJsonObject root;
root.insert("method", "getWndHandle");
root.insert("componentID", "AnalysisCenter");
QJsonObject data;
long id = this->winId();
data.insert("winId", id);
root.insert("data", data);
解决方法:
采用Quint64类型,并通过QVairiant进行转换;
解决办法
Int __stdcall recvcallback(int type)
换成static __stdcall recvcallback(int type)
解决办法:
采用do{}while(0)和break代替;
Involid use of incomplete type
解决办法:
用int强制转换,并且包含#include<QVariant>
HUI报了QPrinter错误
解决办法:
在pro文件中添加 QT += printsupport
解决办法:
在pro文件中加入HUIControl/GeneratedFiles,这些ui_*.h文件是HUI库的一些界面ui文件编译生成后的文件;
解决办法:
将回调函数设置为static静态函数;
:error:ld returned 1 exsit status
报错原因:从windows下经过压缩处理,然后放到linux下,文件系统不一样,so文件结构被改变了
解决办法:
将HUI的压缩包放到麒麟linux系统下,然后用zip HUIControl.zip命令解压缩;
QT中,类要支持信号与槽机制,需要继承自QObject并在头文件开头添加Q_OBJECT宏.如果使用QtCreator创建类时,没有选择继承自QObject类或其子类,而在创建后手工修改继承自QObject并手工添加Q_OBJECT宏,则在编译时有可能会出现"undefined reference to `vtable for’…"错误.
解决方法:
把新创建的类从项目中移除(注意不要从磁盘上删除),编译,然后再添加进工程,QtCreator就会重新解析此类,再编译就不再会出现上述错误。
信号槽连接不能用
Undefined reference to **showEvent()
原因分析:
生成pro文件时包含了不需要的文件rangemonthview.h
解决办法:
在pro文件中找到并去掉就可以了;
多重定义问题,也没有发现有其他定义;
解决办法:
将文件名和类名改成其他名字之后,再重新编译,解决问题;
原因分析:AddTaskItem的头文件件没有加条件编译,或者名称重复定义;
解决办法:
加上条件编译或者将类名改个名字AddFileTaskItem
#ifndef AddTaskItem_H
#define AddTaskItem_H
……
#endif
nvmlInit Failed Graphics Memory May not abtain!
no nvmlDevice Found! Graphics Memory May not abtain
load libvaGLX failed!
hpr tls index{4}
This application failed to start because it could not find or load the Qt platform plugin "xcb"
in "".
Available platform plugins are: xcb, eglfs, linuxfb, minimal, minimalegl, offscreen, vnc.
Reinstalling the application may fix this problem.
已放弃
原因分析:
缺少QT的依赖库,或者Qt依赖库的版本和系统的Qt版本不匹配;
解决办法:
(1) 将file:///opt/soft/Qt5.9.6/5.9.6/gcc_64/plugins目录下platforms文件夹复制到程序运行目录;
(2) 使用自动打包脚本将xcb依赖的库文件复制到lib
终端执行命令:./copylib.sh libqxcb.so,生成lib文件夹,将lib文件夹内的lib文件复制到运行目录;
打包脚本如下所示:
#!/bin/bash
LibDir=$PWD"/lib"
Target=$1
lib_array=($(ldd $Target | grep -o "/.*" | grep -o "/.*/[^[:space:]]*"))
$(mkdir $LibDir)
for Variable in ${lib_array[@]}
do
cp "$Variable" $LibDir
done
#$
(3) 采用同样的方法的生成可执行程序的依赖库,然后也复制到运行目录;
(4) lib文件夹下面的有些库不能删除,这些事HUI依赖的库文件,如下图所示:
如果删除了这些文件,会报如下错误;
undefined symbol: _ZNK15QDateTimeParser5parseER7QStringRiRK9QDateTimeb, version Qt_5_PRIVATE_API (./libQt5Widgets.so.5)
undefined symbol: _ZN15QHighDpiScaling6originEPK7QScreen, version Qt_5_PRIVATE_API (./libQt5Widgets.so.5)
undefined symbol: _ZdaPvm, version Qt_5 (./libQt5Widgets.so.5)
undefined symbol: _ZN15QHighDpiScaling6factorEPK7QScreen, version Qt_5_PRIVATE_API (./libQt5Widgets.so.5)
undefined symbol: _ZN15QHighDpiScaling6factorEPK7QWindow, version Qt_5_PRIVATE_API (./libQt5Widgets.so.5)
undefined symbol: _ZdlPvm, version Qt_5 (./libQt5Widgets.so.5)
undefined symbol: _ZdlPvm, version Qt_5 (./libQt5PrintSupport.so.5)
undefined symbol: _ZdlPvm, version Qt_5 (./libQt5Sql.so.5)
undefined symbol: _ZdlPvm, version Qt_5 (./libQt5Svg.so.5)
undefined symbol: _ZdlPvm, version Qt_5 (./AnalysisCenter)
undefined symbol: _ZdaPvm, version Qt_5 (./AnalysisCenter)
原因分析:
Qt安装的版本和系统使用的QT版本不一致,程序运行默认先从系统的file:///lib/x86_64-linux-gnu目录查找动态库,编译的使用了Qt5.9.6,而系统目录是Qt5.12.0的版本,所以会出现未定义的错误;不能替换系统目录下的Qt库,否则系统会崩溃(别问我怎么知道的);
解决办法:
(1) 使用ldd –r AnalysisCenter 命令查看可执行程序的依赖库,是不是指向file:///lib/x86_64-linux-gnu;如果是,则说明程序运行引用的动态库是系统的Qt库,如果编译的QT库和系统不匹配,则会报错;
(2) 复制Qt5.9.6的库文件到运行目录,然后创建软连接libQtWidget.so.5 链接到运行目录的libQtWidget.so库;(我是直接将HUIDemo中的QT文件直接复制到运行目录,即可运行)
converting to execution chatracter set invalid or incomplete multibyte or wide byte
cc1plus: error: failure to convert GBK to UTF-8
界面出现乱码
使用file –b查看文件的编码格式;
file -b AddClusterTask.cpp
发现是ASCII编码,所以先要对文件编码格式进行转换,可以用iconv命令去转换文件编码格式;
'AnalysisCenter_gch1.0.0/src/AddClusterTask', needed by 'GeneratedFiles/AddClusterTask.o'. Stop.
原因分析:
文件没有找到
解决办法:
在pro文件中删除不存在或者删除的掉的文件;
Ui文件中设置的汉字都可以正常显示,但是从VS2015复制过去的*.cpp文件中通过代买setText()设置的汉显示的都是乱码;如下图所示:
原因分析:
VS2015默认的文件编码格式是ANSI(GBK)编码格式,而麒麟Linux默认的是UTF-8的文件编码格式,linux在编译的时候以UTF-8的格式去读取文件,导致中文乱码;
解决方法:
在Linux系统,将包含中文的文件的编码格式修改为UTF-8;
(1)查看文件编码格式
文件编码格式查看命令:file filename 查看文件编码
(2)修改文件的编码格式
1)在vim中使用 :set fileencoding= UTF-8 来转换文件的编码格式;
2)文件编码格式批量转换命令: find *.cpp -exec sh -c "iconv -f GBK -t UTF-8 {} > ./UTF8Temp/{}" \;
报错:find: 遗漏“-exec”的参数错误
是因为./UTF8Temp/{}" \;最后反斜杠之前少了空格,加个空格即可;
(3)再pro文件中加入编译参数
QMAKE_CXXFLAGS +=-finput-charset=UTF-8 -fexec-charset=utf-8
(4)将转码后的文件替换到原来的文件,然后再重新编译;
会出现如下的错误,这个错误原因是文件中有些中文字符无法识别,导致无法转换,转换后的文件数据丢失,丢了一半;如果源文件格式不是GBK,则转换之后的文件只有3字节,所以先找到3字节的文件,用源文件替换;
如果之前通过vim将文件格式改为utf-8,现在用批量命令去转,发现之前转为utf-8的AddClusterTask.cpp文件会出现转换失败,只有3字节的结束标志;所以要统一用批量命令去转;而且转换不能直接覆盖,要转码到UTF8Temp文件夹下,然后保存原cpp文件,然后再替换转换后文件;
用iconv命令转码的文件,有时会出现问题,只转了一半;后面的代码丢失了,导致无法编译通过;将有问题的文件通过vim 逐个设置格式;或者单独用iconv命令进行转换;iconv -f GBK -t UTF-8 main.cpp >./UTF8Temp/main.cpp;保障转换前后的文件大小相等;
将linux中编译通过的文件,复制到window系统vs2015中再次进行编译,发现会出现所有中文的地方都会报错“常量中有换行符错误”;
原因分析:
Linux中文件转换为了utf8编码,转到window中,默认的编码是GBK,所以中文位置会出现换行符;
解决方法:
将文件保存为utf8 带标签格式;
warning C4828: 文件包含在偏移 0x13c9 处开始的字符,该字符在当前源字符集中无效(代码页 65001)。
解决办法
可以下载转码工具
Powerful Text Replace Tool Free Download -- Replace Pioneer
批量将文件转码为utf-8 bom格式;并且将命令行参数/utf-8改为/execution-charset:utf-8。也就是执行字符集保存为u8,源文件不去要求utf8;
error LNK2005: SU_ControlWrite_HID 已经在 LicenseVerify.lib(SRUsbToken.obj) 中定义
原因分析
连接的时候会链接多个,链接器无法取舍;
解决方法
在链接器命令行加上/force:multiple ,意思是是出现多个,强制链接多个;
Linux中文不乱码的要求是文件采用utf8编码格式; QMAKE_CXXFLAGS +=-finput-charset=UTF-8 -fexec-charset=utf-8
编译参数要加上window中文不乱码要求在每个源文件头部加上宏定义#pragma execution_character_set("utf-8"),或者在编译命令行中输入:/execution-charset:utf-8,若只需要修改源代码的编码,也可以只输入:/source-charset:utf-8
/utf-8相当于同时设置源代码和可执行文件。
解决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,
麒麟系统中执行./AnalysisCenter出现无法打开桌面应用,安装图形桌面后,Linux通过终端命令无法启动图形应用,报错“Could not connect to any X display.”或“Gtk-WARNING **: 10:49:06.625: cannot open display: :0”等。
是因为用户没有显示权限,需要执行命令xhost获取可以访问当前主机上的增强 X-Windows显示权限,之后就可以打开了;
银河麒麟系统安装后,没有可执行权限,运行bash或者二进制程序都提示bash权限不够或者类似报错
解决方法
执行sudo setstatus softmode -p 即可,如下图所示:
sudo setstatus softmode -p
为了实现弹出窗口边框周围带阴影的效果;采用外层设置透明,内层边缘显示阴影;代码如下。但是在window下可以,在麒麟系统中,透明部分的窗口直接变为黑色;setAttribute(Qt::WA_TranslucentBackground);不生效了;
setWindowModality(Qt::ApplicationModal);
setWindowFlags(Qt::FramelessWindowHint|Qt::WindowStaysOnTopHint | Qt::SubWindow);
setAttribute(Qt::WA_TranslucentBackground); //背景透明
//边框阴影效果
m_ShadowEffect = new QGraphicsDropShadowEffect(ui.widget);
m_ShadowEffect->setBlurRadius(34);
m_ShadowEffect->setColor(QColor(0, 0, 0, 51));
m_ShadowEffect->setOffset(0, 12);
ui.widget->setGraphicsEffect(m_ShadowEffect);
setFocusPolicy(Qt::StrongFocus);
解决方法:
是因为使用的麒麟系统不支持透明阴影等渲染效果,需要安装一个软件xcompmgr。Xcompmgr是一个简单的混合窗口管理器,可以实现阴影、原生窗口透明(配合transset工具)等特效。Xcompmgr设计初衷只是实现混合窗口管理器的概念,所以比起同类混合窗口管理器如 Compiz Fusion,Xcompmgr轻量许多。Xcompmgr不替代任何窗口管理器,所以对于Openbox和Fluxbox这类缺乏特效的窗口管理器来讲,配合Xcompmgr能得到更华丽的视觉效果。
执行如下命令安装软件
sudo apt-get install xcompmgr
然后再输入xcompmgr ,启动xcompmgr(关闭终端);
或者设置xcompmgr开机自启动
再次打开程序, 就可以正常显示了;
通过Socket TCP发送消息,实现进程间的通讯,突然消息解析报错 ,协议头的结构体的长度不一致;
例如下面的的结构定义,在window系统中,结构体大小是12字节;但是在 linux系统中,是以最大的变量长度对齐,最大的是unsigned long 4字节,所以结构体的大小是4*4+4+4=24字节;
struct msg_header
{
char head[4];
unsigned long pack_len;
int code;
msg_header()
{
head[0] = 'H';
head[1] = 'K';
head[2] = 'P';
head[3] = '&';
}
};
解决方法
为了实现同样是16字节,需要在结构体定义中加上#pragma pack(push,1);表示按照1字节对齐; #pragma pack()则是取消字节对齐设置,避免对其他的结构体造成影响;
//协议头对齐方式
#pragma pack(push,1)
struct msg_header
{
char head[4];
unsigned long pack_len;
int code;
msg_header()
{
head[0] = 'H';
head[1] = 'K';
head[2] = 'P';
head[3] = '&';
}
};
#pragma pack()//取消对齐,避免对其他造成影响
没有安装或者驱动ssh服务
sudo yum install sshd
sudo yum install openssh-server
sudo apt-get install sshd
sudo apt-get install openssh-server
sudo service ssh start
重新安装了麒麟系统,安装了QtCreator之后,原先可以正常编译的工程,突然不能编译了;报错如下
20:28:00: Could not determine which "make" command to run. Check the "make" step in the build configuration.
Error while building/deploying project AnalysisCenter (kit: Desktop Qt 5.9.6 GCC 64bit)
When executing step "qmake"
原因分析:
缺少了G++编译器;
解决方法:
安装G++编译器,充电线USB插到PC设备上面,手机去设置-》USB共享网络-》USB共享网络;执行sudo apt-get install build-essential
或者下载G++软件包去安装:build-essential_12.8kylin1_amd64.deb
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。