zoukankan      html  css  js  c++  java
  • QT | 记录自己遇到的报错

    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:Qtopencv3uildx64vc14in)复制到C:WindowsSystem32下即可(系统必定会去这个目录下调用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 PanelClock, 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里面

    {
        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()));
    
    }
    View Code

    然后定义槽函数

    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

    未完待续

  • 相关阅读:
    新年放大招:Github 私库免费了!
    阿里启动新项目:Nacos,比 Eureka 更强!
    运行 Spring Boot 应用的 3 种方式
    过了所有技术面,却倒在 HR 一个问题上。。
    hdu 5428 The Factor(数学)
    poj 2385 Apple Catching(dp)
    poj 2229 Sumsets(dp 或 数学)
    poj 1759 Garland (二分搜索之其他)
    poj 3662 Telephone Lines(好题!!!二分搜索+dijkstra)
    poj 3669 Meteor Shower(bfs)
  • 原文地址:https://www.cnblogs.com/QingHuan/p/8350845.html
Copyright © 2011-2022 走看看