突然翻到2019年的笔记本,看了一下自己所做的笔记,列举着一些Qt 和 VS开发的一些常见错误分析以及相关解决方法,突然就想放在csdn上,便于查看,毕竟笔记本容易掉,放着放着就不知道放哪儿去了 ,虽然随着开发时间的不断增长,这些错误都能轻松解决呀,但还是希望能帮到一些初学者,提供一些帮助,解决一些疑惑。
1.为什么不能直接cout一个string字符串(而需要添加头文件#include<string>)
分析:STL中的许多头文件都包含std::basic_string类定义式,它们间接的包含了<xstring>(但不要试图直接包含<xstring>),保证可以在头文件中使用std::string类:
原型-》 typedef basic_string<char,char_traits<char>,allocator<char>> string;
问题在于 operator<<却定义在<string>头文件中,必须手动将之包含。
2.Qt error: No rule to make target xxx.h,need by "debug/*.o".stop
分析:pro文件出现冗余的问题(检查.pro文件);
删除*.o文件后,清楚,再重新构建;
删除debug目录文件重新构建;
3.Qt error:mutiple undefine of QClass::QClass,复杂定义
分析:检查 pro文件是否存在重复的文件cpp/h文件(重复添加源文件或者头文件)
4.invalid new-expression of abstract class type " "
分析:说明父类有纯虚函数没有实现(子类中)
5.undefined reference to "vtable for ~"
分析:Qt中,类要支持信号和槽机制,需要继承Qobject,并且在头文件中添加Q_OBJECT宏;
如果创建时,没有选择继承Qobject类或其子类,而创建后手工修改后继承Qobject,并添加Q_OBJECT宏,编译会出现这种错误;
解决方式就是把新创建的类从项目中移除(不要删除磁盘文件),再次添加文件到项目中,就会重新解析此类,再编译就不会出现上述的错误了。
6.unfined reference to "QClass::staticmetaobject" ?
分析:调用QClass类的文件中,添加类的头文件到pro文件中(添加已存在的文件),即可解决
7.expected class-name before "{ token }"
分析:头文字声明没有添加(继承时不要忘记基类的头文件)或基类包含了子类头文件
8.强制转换(父、子类)问题
分析:子类可以转换为父类,父类也可以转换为子类;(父类从哪个子类转换,就会调用哪个子类的函数<虚函数实现>)
9.error:插件项目中,未定义类的相关函数
分析:不仅需要添加.h文件,还需要添加cpp文件(可以通过绝对路径方式添加)
10.QVariant 使用
条件:类需要默认的contructor 和 destructor;
必须使用Q_DeECLARE_METATYPE宏,类的下面实现,但好像如果继承Qobject类,就不需要添加宏(未检验)。
11.undefined reference to " _Imp_"
分析:因为库文件没有找到,添加LIBS += -L+路径 + -l库名,可以将其修改为绝对路径就不再报错。
12.如何添加外部库文件?
分析:添加第三方的库文件(#include "xxxx.h");
添加lib文件(放在对应的工程目录下)
格式(LIBS += -L+路径 + -l库名)
添加dll文件(输出目录下)
13.Qt error:makefile makefile error?
分析:检查pro文件是不是有错误(pro文件导致)
14.Qt error:cannot retrieve debugging output?
分析:此错误指无法获取调试输出信息,因打开了多个Qtcreator.exe,需要关闭运行的程序,可以在一个exe中,打开多个项目同时执行。
15.类中的回调函数必须使用static的原因?
分析:如果callback函数是一个类成员函数,就要添加static,原因在于必须舍弃掉类成员函数的隐藏指针this参数;
否则,会导致函数参数列表与被要求的声明的形式不一致;
类封装回调函数条件:回调函数只能是全局或者静态的;全局函数会破坏类的封装性,顾不予录用;静态函数只能访问类中的静态成员,不能访问非静态。
16.容器释放问题?
分析:工作方式分为(对于内置类型int,char,double,纯粹的位拷贝)和(对于自定义的对象,进入容器的定指定对象的拷贝)
STL不管是erase或remove都不会释放对象的内存空间,只是师范类STL里面存放的这个对象或指针的空间,需要手动释放(delete,再erase)
17.Qt 主线程执行大量计算,界面卡顿,有什么办法优化?
分析:用线程来解决问题(推荐)和在长时间操作的部分代码加上QApplication::processEvent();
18.程序中 if elseif ... else和switch的效率使用情况
分析:建议判断超过了3-4个,使用switch,反之使用if else,经过测试(效率时间有所提高,更简洁,美化程序)
19.undefined reference to 'qmain(int,char**)'?
分析:导致此错误的原型①项目中缺少main.cpp文件②main(void)改为main(int argc,char**argv)
③项目pro文件内容为空,必须含有内容,不能为空。
20.vector的清楚数据
分析:erase会返回下一个迭代器,vector 经erase后会重新配置空间,导致后面的迭代器受到影响,无法使用,正确使用:
if(*iter)
{
delete *iter;
*iter = nullptr;
iter = vec.erase(iter);
}
else
iter++;
21.linux-Qt 生成动态库时,产生多个版本号的.so文件,如何解决?
分析:库项目文件pro,添加CONFIG += plugin. 即可解决
22.const + &引用的区别?
const string &c; 不可更改c变量的值
string &c; 可修改变量c的值,并且传入的变量可改变;(引用)
string c;可改变形参的值,但原变量的值不会改变;(值传递)
23.Qt errer:makefile Debug::253 debug moc_q***.cpp errorc错误
分析:添加Q_OBJECT,但不从QObject继承,则会报错
24.skipping incompatible (不匹配)
分析:环境 系统不匹配(检查是32位或者64位)
25.Qt python error:fatal python errpr unable to load the file system codec?
分析:①初始化Python 解释器前使用 :py_setPythonName来设置Python的根目录;
②使用py_setpath 来设置模块的路径以及模块文件
py_setpath(L"d:/python/lib;d:/program/test")
安装路径 模块文件.py
26.qt 调用 Python,slots出现冲突,如何解决?
分析:slots出现冲突,则通过宏来解决
方法1:冲突地方:前面添加 #undef slots =>取消slots定义(中间则是定义的位置)
方法2:后面添加:后面添加 #define slots Q_SLOTS =>恢复slots宏定义与Qt中ObjectDef.h一致
27.Qt 打包程序
分析:利用Qt自带的命令行窗口,进行打包;
①把exe文件放在自定义文件夹下面
②打开窗口,进入目录里面
③输入:windeployqt xxx.exe 即可
需要的文件dll等都要在此目录下
28.winsock2.h重定义问题?
分析:需要定义 #define WIN32_LEAN_AND_MEAN
29.常量中有换行符 error vs2013 ?
分析:代码中有中文的符号或者中文或者任何不是英文的字符
30.c++ 输入函数
分析:①scanf(),读取字符串时不检查边界,容易内存泄露;
②scanf_s,安全函数,必须提供表明最大多少位字符,防止溢出;
③cin
④cin.get() cin.get(array,len) getline(cin,string s)
⑤gets() getchar()
注意:①②③遇到空格tab/换行符结束;④⑤包含空格,只有遇到换行符结束
31.vs2013:warning C4819:该文件包含不能在当前代码页(936)中表示的字符,请将该文件保存为unicode格式以防止数据丢失?
分析:打开warning文件点击文件 选择 “高级保存选项”,改变编码格式【简体中文】 为 【unicode】即可。
32.warning c4566:通用字符名称“/u202A” 表示的字符不能页(936)中表示出来
分析:复制路径时带着特殊字符,手动输入路径即可。
总结:解决问题时,编译出现错误,不要怕错误多,要一个一个的去找,一个一个的解决,有很多错误是重复的或者连贯的(心态要好,不要嫌多),总会解决的。