QT 常见报错,及相应对策
0. 遇到所有莫名其妙的问题(完全按照教程,但一直报错)
- 删除工程文件同级目录下的构建文件(以build开头的文件夹)
- 重新执行qmake
- 重新构建项目
- 检查所有的路径问题,特别是依赖库的路径问题
- 有时候遇到了问题A,其实是问题B引起的,所以,可以先记下问题A,然后继续做,可能问题A不知不觉就被解决了……
- 去GOOGLE用英文搜索问题
- 找网上能运行的样例,新建一个工程作为测试;如果可以的话,仔细对比和自己的工程的区别
1. The program has unexpectedly finished. 程序异常结束
此时可能可以BUILD通过,但是再运行时出现这个错误。 一般是由于某个DLL库没有被找到,比如opencv的。
OpenCV的配置过程中我遇到了一个BUG,按照http://blog.csdn.net/poem_qianmo/article/details/19809337的提示,
1. 先在系统中配置好环境变量(注意环境变量有上下两个窗格,上面是“用户环境变量”,下面是“系统环境变量”,为了保险,还是放在“系统环境变量”中比较安全)
2. 在VS中的“属性”设置中配置好
然而还是无法运行,显示“The program can't start because opencv_world300.dll is missing from your computer”,即缺少DLL文件。这个DLL文件理论上在配置环境变量时已经添加到系统的调用中了,但是还是无法找到,是一个BUG。
怎么解决呢?简单粗暴,将所有相关的DLL文件(我的是在D:\Qt\opencv3\build\x64\vc14\bin)复制到C:\Windows\System32下即可(系统必定会去这个目录下调用DLL)。
而这个找不到DLL文件的错误,并不会在QT的报错中显示出来,所以在VS中创建了一个OPENCV的程序进行测试,最终发现是这个BUG。所以遇到错误了首先要冷静分析,其次要使用“控制变量法”,将OPENCV的问题从QT的整个工程中分离出来,单独对OPENCV进行测试
最后,师兄说可以在Windows Shell中使用 "echo %PATH%"的方式来查看PATH名字的环境变量都存了什么地址,然后发现……OpenCV的地址使用了中文的分号来进行间隔;改成英文的分号之后什么都没问题了……ʕ •ᴥ•ʔ 以后一定要注意啊
2. moc ****.obj:-1: error: LNK2019:
可能是在.ui的设计界面中使用了Go to slot,然后在.cpp中会自动创建一个函数,同样会在.h的类中添加上这个函数
但是如果在.cpp中删除了这个刚创建的函数,则.h中不会自动删除,此时可能会出现这个报错
一定要保持.h中创建的类,在.cpp中有相对应的函数,否则QT无法识别这个具体的错误,给出的报错信息比较迷惑
3. error: C2447: “{”: 缺少函数标题(是否是老式的形式表?)
本来项目编译运行都没问题,突然报这个错误,然后去看代码没找到问题,去翻了GIT上的历史版本也没发现和现在的代码有什么区别
突然想起来,本来这台机子安装的是英文版的Windows,但是QT每次报错都显示????,不显示中文字符,所以下载了个中文语言包,
打算把系统语言设置成中文。应该就是编码的问题,QT直接调用了系统的编码来对整个项目进行编译,所以系统编码改变了,编译也会出现肉眼无法识别的错误。
现在把系统默认语言又设置成了英文,在“Control Panel\Clock, Language, and Region”这里,Administrative->Change System Local这里又重新改成了English(United States)。貌似这里是修改对不支持Unicode的程序的语言支持库的地方,是导致这个报错的核心问题。
看来想改系统语言还得再调试一番
4. 无法解析的外部符号 未找到文件**.obj
参考:http://blog.csdn.net/hzt12345hf/article/details/52398000
无法解析的外部符号出现可能的原因:
[0]出现无法解析可能是因为lib文件不正确,比如64位的编译配置,结果使用的是32位的lib包.
[1]只写了类声明,但还没有写实现类,造成调用时无法解析
[2]声明和定义没有统一,造成链接不一致,无法解析
[3]没有在项目属性页的链接器的命令行选项加入相应的类包。
[4]没有在c++包含目录和库目录加入相应的类包路径
[5]在测试工程中被测文件目录可能需要包含被测类的cpp定义文件
[6]ICE接口测试时,无法解析可能因为被测文件没有包含进相关的cpp文件,另外,在TestSuite_ProjectRun.h文件中需要包含IProjectRun.h头文件,及相关的头文件(举例)。
[7]import相关的无法解析内容,解决办法是在链接器的依赖项中加入相应的动态库
[8]出现如下错误的原因一般是动态库没有包进来。__imp
ProjectRun.obj : error LNK2019: 无法解析的外部符号 __imp__StartHistoryLocalModule,该符号在函数 “protected: virtual int __thiscall HiRTDB::CProjectRun::DoStart(void)” (?DoStart@CProjectRun@HiRTDB@@MAEHXZ) 中被引用
[9]error LNK2001: 无法解析的外部符号 __imp___CrtDbgReportW
工程属性,C/C++,代码生成,运行时库选择MDd,
[9]无法解析的外部符号”_declspec(dllimport) public: int __thiscall HiRTDB::CTagTree::GetObjectA(int,struct HiRTDB::SBaseReadProps const &,struct HiRTDB::SBaseReadValues &)” (__imp GetObjectA@CTagTree@HiRTDB@@QAEHHABUSBaseReadProps@2@AAUSBaseReadValues@2@@Z),该符号在函数”public: int __thiscall HiRTDB::CStringImpl::Get(int,struct HiRTDB::SStringReadProps const &,struct HiRTDB::SStringReadValues &)” (?Get@CStringImpl@HiRTDB@@QAEHHABUSStringReadProps@2@AAUSStringReadValues@2@@Z) 中被引用
原因可能是工程配置文件中有多余选项,请参考其他模块的配置选项,不要有多余配置。
[10]自己编了个小程序,一开始编译忘记在.pro工程中加入类库,所以导致出现如下图所示错误,加上类库后清除重新编译,发现还是同样的错误,百思不解,搜百度有网友提议删除目录下生成的调试文件夹,然后尝试过后发现此方法可行,这里做个记录,以防以后又发生这样的错误
5. QStackWidget使用后,无法切换页面,且无明显错误
首先是将各个Widget添加到QStackWidget里面
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
{ ui->setupUi(this); controlEndMain *liveListManage = new controlEndMain(tableName); serverList *serverListManage = new serverList(this); ui->stackedWidget->addWidget(liveListManage); ui->stackedWidget->addWidget(serverListManage); connect(ui->toLiveListManage, SIGNAL(clicked()), this, SLOT(switchToLiveListManage())); }
然后定义槽函数
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 void topFrame::switchToLiveListManage(){ 2 ui->stackedWidget->setCurrentIndex(2); 3 qDebug() << ui->stackedWidget->currentIndex(); 4 }
但是就会出现问题,点击相应的按钮后并不能切换过去
实际是因为,网上的例子,如http://www.cnblogs.com/ourran/p/6691769.html
其中的QStackWidget是在代码中手工定义的,
而我的QStackWidget是在Design模式中用图形化的方式定义的
这种方式有一个隐患,就是QStackWidget会默认包含两个空页面,所以当使用
ui->stackedWidget->setCurrentIndex(2);
的时候,这个INDEX其实是有问题的,0和1已经被那两个默认的空界面占住了,
所以设置序号为0就会什么都不出现……而且表面上看起来完全正确
只需要去WINDOWS资源管理器里面,用notepad++把.ui文件里,QStackWidget中默认的两个页面删除就行了
6. 在数据库的插入操作中,没有明显问题,但是插入操作失败
比如下面这个语句就是一直以来的问题点
query.exec("insert into E1State values(2, '162.105.95.214', 'Running', 74.2)");
问题在哪里呢?各个数据都符合之前定义的格式
问题其实是倒数第一个逗号是中文字符……
所以以后写代码还是要保持好习惯,直接Win+空格,切换成纯英文键盘(此模式下,按Shift键不能进行中英文切换)
否则太多自己给自己挖的坑了
7. DirectShowPlayerService::doSetUrlSource: Unresolved error code 0x80004005 ()
文件路径不对或者文件名是中文的
比如127.0.0.1:8086/01这里应该是/1,因为在VLC中填写的路径是1不是01
未完待续