常见的错误集合解决方案(二)
常见的错误集合解决方案(一)
七、
关于在Qt中使用QVTKWidget插件问题
问题描述:将QVTKWidget插件的dll放到Qt下面,但是出现了一个现象,就是Release下面可以生成并运行,但是Debug下面死活运行不了,程序启动不了(但是可以生成成功)
问题解决:
第一:检查是否包含了VTK下面的bin文件是否在VS中配置;
第二:如果配置了还是不行,那就注意了,因为下载的PCl中的VTK并不支持Qt的可视化,就必须要自己下载VTK的源码进行CMake编译,具体的编译见链接,编译完了我们会得到支持Qt的可视化版的“进化态”的VTK;
第三:因为需要将Qt和VTK结合嘛,我们的程序可以生成表示代码没问题,但是执行的时候出现问题,表示程序启动然后在链接动态库的过程中出现了问题,所以找到原来的VTK目录下的bin目录中的一个叫vtkGUISupportQt-8.1.dll的文件,将我们CMake编译的VTK中的Debug下的该文件复制覆盖原来的这个即可,然后就可以执行得到界面了
后续问题:这里出现了另外的一个问题,就是加入了DLL插件后,有时候在VS中打开UI文件时,出现无法打开的问题,这里暂时的解决是先把DLL插件从文件目录下移除,就可以打开了,但是这时点击去打开的UI是没有QVTK的窗口的,这是一个不好的问题。但是把release下的dll放在Qt下面又是可以打开UI界面的,但是放Debug的dll到Qt下面就会出现问题,目前不知道为啥会出现这个
八、关于无法打开ui_mainwindow.h、moc_xxxx.cpp和qrc_xxxx.cpp的解决方案
问题描述:在打开别人的工程或者打开网上下载的工程的时候会出现无法打开moc_xxxx.cpp和qrc_xxxx.cpp文件?
问题解决:首先确定下这两个文件都是什么文件,一般来讲这些文件都是在VS下的Qt编程的时候出得到的生成文件,一般都是在Generated Files中,如下:
但是在有些时候这几个文件是无法打开的,下面一个个文件来说明下怎么解决:
① ui_xxx.cpp无法打开:这个文件是和UI界面联系的h文件,右键重新编译UI即可
② moc_xxxx.cpp无法打开:点击和这个cpp文件相对应的.h文件,然后右键编译即可得到
③ qrc_xxxx.cpp无法打开:这个文件是和资源文件相关联的cpp文件,找到对应的资源文件,然后右键编译即可得到
九、VTKBug——VTK8.1运行时出错:0xC0000005: 读取位置 0x00000000 时发生访问冲突
问题描述:
遇见这种问题一般都是空指针,即:指针里没有赋值。如果你对null 进行操作就会产生空指针异常
根据VTK官方解释:VTK/VTK 6 Migration/Factories now require defines。英文不喜欢看,可以看一下中文的:VTK/VTK6 迁移/“工厂化”需要的定义。
可以从中发现之前的代码由于是VTK5.10.1版本写的,可以正常运行,但是在VTK6之后的版本,VTK采用了工厂模式,而工厂模式需要“自动初始化”,具体取决于在VTK配置时启用哪些模块。如果您启用所有模块,并在不使用CMake的情况下构建项目,则需要在项目中进行一些定义,以使工厂正常工作。
9月10号, 2013,有一个新的宏添加进来,可以让这个过程更加简单。
解决方法
在源文件头部添加代码:
#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingOpenGL);
VTK_MODULE_INIT(vtkInteractionStyle);
十、Qt中建立了QVTKWidget插件后,鼠标点击就会崩溃
问题描述:在Qt的UI中拖了一个QVTKWidget的插件,但是在启动启程后出现鼠标点击该控件窗口就会导致程序崩溃
问题分析:1、因为用到了VTK的可视化功能,必须在程序的中有该部分的初始化
2、因为下载PCL1.8.1中的VTK并不支持Qt,所以需要重新编译VTK,然后编译的VTK是否和原来的VTK发生的冲突呢?
问题解决:
1、关于初始化部分:
需要初始化关于VTK插件,也就是起码的包含相关的头文件、include相关的.h的路径,基本的如下:
#include <vtkAutoInit.h>
#include <vtkRenderer.h>
#include <vtkOpenGLActor.h>
#include <vtkOpenGL.h>
#include <vtkWidgetEvent.h>
#include <vtkWidgetSet.h>
#include <vtkPlaneSource.h>
#include <vtkPolyData.h>
#include <vtkSmartPointer.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include "QVTKWidget.h"
以及对应的模块初始化:
VTK_MODULE_INIT(vtkRenderingOpenGL);
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingFreeType);
关于这里的模块初始化可以看下前面的第十条
然后还有include路径:
2、关于PCL中原版本的VTK和编译的新的VTK的包含问题
关于这个包含的bin文件到底是该包含那个呢,如果包含错了就会出现问题的
提供下这里的解决方案:
把编译VTK里面的bin文件夹下的dll文件全部覆盖掉原来的VTK的dll(覆盖之前先把原来的文件夹copy份)
编译的dll
这里覆盖后即可了,
其实这里有种方法是不覆盖也可以的,dll文件是程序执行过程中需要链接的动态库,
第一,我们可以在环境变量中去添加编译的VTK的bin文件路径(应该要删掉原来的VTK路径,没试过,记得添加后重启电脑)
第二,我们可以在上面的附加包含目录中去把编译的VTK的bin文件路径也包含进去(要不要都包含,还是只包含一个即可,没试过)
下面的是测试下这两个bin文件的包含问题:
① 测试在附加包含目录下面包含两个bin文件,启动程序,鼠标点击VTK控件,报错:
鼠标的响应消息崩了
原因分析:因为在系统环境变量中并没有新编译的VTK的bin路径,导致启动后去链接的时候并没有链接到dll,结果就报错了(因为配置环境变量需要重启电脑,并没有试过,猜测是这样的)
② 只包含新编译的bin文件路径
报错,报错位置和上面一样
③ 都不包含,全靠环境变量去链接
报错,报错位置和上面一样
④ 添加新编译的VTK的bin文件路径到环境变量中去,但是呢,不删掉原来的VTK的bin路径
报错,报错位置和上面一样,估计还是需要讲原来的VTK的bin文件路径删掉才可以的
⑤ 添加新编译的VTK的bin文件路径到环境变量中去,删掉原来的VTK的bin路径
测试ok,包含的原来的VTK的lib文件也可以删掉(不删掉好像也是可以的)
总结:第一,需要新编译的VTK的bin文件里面的dll来作为支撑,第二,需要在环境变量中去配置好bin的路径
十一、加入QVTK插件后无法在release模式下打开程序
问题描述:在Qt中加入QVTKWidget插件后,debug模式下可以正常的运行,但是在Release模式下无法启动运行,如图:
问题分析:应该是在Release模式下包含了debug的库,或是应该包含支持Release模式下的dll,但是没有包含
第一:先看看Release模式下的exe的需要的dll有哪些
主要是看下第三方库的情况,也就是PCL、VTK的库,在配置中没看出来什么问题,跟踪到问题还是出在了QVTKWidget上,因为用到了可视化工具,还是出在了这个插件上了,如图:
方案1:解决的办法是在环境变量中添加了Release的bin路径,而且路径是放在了Debug的bin路径前面,但是这样添加后就会导致Debug模式下无法运行了
方案2:添加环境变量,Release放在Debug后面,但是这样,就还是导致在VS里面是无法打开Release模式的,所以就得找到Release模式下生成的EXE需要支持的DLL文件了,然后将这些dll文件全部放在exe同目录下面即可运行了
总结:推荐采用方案2,这样都可以运行,
PS:其实还有种方案可以尝试下,包含的lib文件是分debug和release的,可以将两者单独分开来放在两个不同的文件夹下,然后在debug下包含debug模式的,在release下包含release模式的;同理包含的bin文件也是分为debug和release的,一样的方式分两个文件夹分别包含。但是这里有一点需要考量的就是系统环境变量中设置的是debug模式在release模式的前面,不知道这样的设置会不会有影响(因为系统变量会先起到链接作用,即使在VS下面去分别包含了)
十二、Qt的.ui文件在VS中无法生成ui_xx.h文件的解决办法
问题描述:在用到别人的工程的时候,有时候可能会出现无法生成ui_xx.h文件,.UI文件有,但是没有.h文件,
问题解决:首先尝试”第八条“解决方式,如果还是无法得到ui_xx.h,那么就参照如下的:
看看工程中的ui文件的属性,如下:
最开始的“项类型”是不参与生成的,那么不参与生成肯定就不会有.h文件了,改为“自定义生成工具”
如下:
需要在上面的几个参数项中填一些东西:
命令行:
setlocal
D:\Qt5.6.3\5.6.3\msvc2015_64\bin\uic.exe -o "F:\360MoveData\Users\znlangel\Desktop\CloudViewer-master\src/ui_xxx.h" "F:\360MoveData\Users\znlangel\Desktop\CloudViewer-master\src\xxx.ui"
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd
其中上面的Qt路径ui_xxx.h路径根据自己的来
说明:Generating ui_XXXX.h
输出:F:\360MoveData\Users\znlangel\Desktop\CloudViewer-master\src\ui_xxx.ui
附加依赖项:F:\360MoveData\Users\znlangel\Desktop\CloudViewer-master\src\xxx.ui
然后应用---》右键ui文件编译即可
十三、出现lnk2019,无法解析外部符号qt_metacast或qt_metacall
问题分析:出现这样的问题,像其他的我们还可以去找下无法解析的函数在哪里,然后逐步的去解决(一般就是没有链接到DLL或是lib文件了),但是在这里的QT中出现的这个问题,首先你都定位不到这个类的函数在哪里,出现这个问题一般就是Qt里面的moc_XXX.cpp出现了问题,如下:
这两个文件是跟着UI文件一起生成的,一般就是在Generated Files文件夹下,然后当我们使用别人的工程时候,第一,可能会丢失这些moc_XXX.cpp或qrc_XXX.cpp文件,具体的找回来方案见“方案8”;第二,我们打开工程,在Generated Files可以看到这些文件,而且还可以双击打开文件,但是我们还会报错呢,注意了,这个时候看看文件前面有没有一个红色的“-”,这个时候我们可以双击打开,但是文件是并未加载到我们工程的,解决办法就是先讲文件移除,然后重新加载进来即可了。
十四、出现kdtree无法解析的问题
问题描述:在项目中用到了八叉树的类,但是却出现了无法解析的问题,但是代码并没有标红的,而就是无法生成
十五、Qt工程报错Template classes not supported by Q_OBJECT
问题描述:明明好好的工程,但是突然打开就各种标红,
然后重新编译就报了上面的问题,这种问题主要是moc文件出现了问题,
然后重新编译就报了上面的问题,这种问题主要是moc文件出现了问题,
双击moc文件,发现无法打开,这个文件本来应该是跟着UI生成的文件,在本地的工程下也无法找到该文件,那么
重新把这个文件生成出来就可以了,具体的方法见问题八
十六、boost文件里面的错误,“不是std成员”错误
问题描述:在工程中生成时报上图错误,开始以为是PCL里面的boost库文件和C++里面的某些库文件发生了冲突,后来发现是
包含的库文件的路径发生了错误,
打个简单的比如,如下的路径是boost在PCL中的路径:
D:\PCL1.8.1\PCL1.8.1\3rdParty\Boost\include\boost-1_64\boost
然后我们如果在vs里面的配置库目录的时候一直配到了boost这里,但是我们的工程头文件中要是出现了这样一个
“#include<boost/thread.hpp>"时就会报错的,为什么,因为你包含的路径到了boost,去链接找的时候就直接在boost下面去找了
但是不会有路径boost,这样的话要么将头文件的boost去掉,要么包含到boost的上一级目录,即boost-1_64即可(推荐这种,
因为很多头文件在pcl的文件中有包含的)
十七、error MSB6006: “cmd.exe”已退出,代码为 3
错误描述如下,在编译UI文件的时候报错msb6006,首先理清楚为什么会编译ui文件失败,导致ui文件失败的最直接的原因就是moc_xx.cpp文件和ui_xx.h文件找不到导致的,还就是qrc_xx.cpp文件找不到导致的,如下的几个文件无法找到:
同时这几个文件也出现了确实无法打开的尴尬情况(双击无法打开),但是这几个文件在本地啊,为什么无法打开,右键也无法编译呢,这就涉及到Qt的版本问题以及给的编译路径的问题了,因为电脑里面装了32位的Qt和64位的Qt,这里的这个功能是需要32位的Qt来编译的,但是我给的链接编译器的是64位的Qt,所以就会出现无法编译的问题,如下:
上面D盘的Qt就是64位的,理论上之前也是可以的,但是后来把5.6.3版本的这个Qt卸载了,也找不到路径了,更是会报错的,然后将该路径改为32位的Qt版本,如下:
上面改动的说明情况介绍见“问题八和问题十二”
平台活动指南
公众号将会推送基于PCL库的点云处理,SLAM,三维视觉,高精地图相关的文章。公众号致力于理解三维世界相关内容的干货分享。不仅组织技术交流群,并且组建github组群,可自由分享。交流提问。
历史文章查看点云学习历史文章大汇总
1.一起学SLAM:第三期:一起来学SLAM
2.招募乐于分享的你:点云PCL运营招募啦
3.招募计算机视觉,SLAM,三维视觉,点云等相关领域博客博主,或者公司开设专栏,只要与平台主题相关,乐于分享,都可以与本平台合作经营,发布原创文章。并且可以加入微信,QQ交流群,认识更多志同道合的一起同行分享。
4,相机测评活动:图漾双目,小觅相机,奥比中光三款相机测评活动正在进行中,,,,,,
●文字来源 | 点云PCL资源组