项目需要用到PCL库,想集成到Qt中进行开发。有很多网页描述了具体过程,但作为一个小白,有些细节我没有注意到的,导致配置过程出现了很多波折,运行示例代码时发生了各种错误。所以把自己最后成功的方案记录下来,警示自己,也希望能给有需要的朋友做个参考。
安装Qt及cmake
Qt自不必说,cmake是后面用来重新编译VTK的源码用的。这两者的安装都没啥问题,从官网下载合适的安装包一直下一步即可。这里我使用的安装包版本为:
包 | 版本 |
---|---|
Qt | qt-opensource-windows-x86-5.10.1.exe |
cmake | cmake-3.15.1-win64-x64.msi |
安装Qt时,要安装对msvc 64位编译器的支持(因为我后面安装的PCL用的是64位的包)。
安装PCL
可以直接使用GitHub上提供的 AllInOne installer。由于我电脑上已经安装的Visual Studio版本是2015,所以我下载了 PCL-1.8.1-AllInOne-msvc2015-win64.exe。安装过程与安装一般软件无异,一直下一步即可。需要注意的是:
-
安装时如果出现选择路径的地方,要把路径中的空格全部删除,这据说是由于Qt无法识别路径中的空格;
-
安装过程中会弹出PCL的支持模块OpenNI2的安装界面,网上都说为了便于管理,最好把OpenNI2按照到PCL安装目录的 3rdParty 文件夹下。具体可参考这里。
重新编译VTK
这是为了能够在Qt中使用PCL(预构建的 PCL 安装包中, VTK 没有添加对 Qt 的支持。
这一步主要参考了两个网页: 1 和 2。
大致过程:首先需要下载VTK的源码,然后用cmake处理源码,生成Visual Studio解决方案,最后打开生成的解决方案进行编译。用cmake 做 configure 的过程中要把上面两个网页中的步骤都做好,此外还有一些需要额外注意的地方:
- 在使用cmake处理源码时,第一次点击Configure时会弹窗要求选择编译器和目标平台,如下图
因为安装的 PCL 是 x64 的,所以一定要注意第二个框里(Optional platform for generator)要选择x64。我第一次编译 VTK 时这里就忘记选了,不选则使用默认的32位平台的设置,最后导致在链接的时候会报错。 - 第一次Configure后,要在 VTK 下勾选VTK_ALL_NEW_OBJECT_FACTORY 和 VTK_DEBUG_LEAKS。
之所以想到要勾选这两项,是因为我某次重新编译 VTK 并运行示例程序时,会报
无法解析的外部符号 "public: __cdecl vtkDebugLeaksManager:: …
这样的错,以及一个貌似和 vtkNewObjectFactory 相关(抱歉没有做好记录,忘记完整的错误信息了)的错。 查了很多资料之后,发现这是因为编译时找不到相应的 lib 文件,然而我明明把 VTK lib 目录下的所有 lib 都添加到 Qt 里了 T_T。无奈之下打开 cmake 浏览了一下所有的选项,看到了这两个似乎相关的,勾选以后重新 generate 并用 VS 生成了一次,就不再报错了。
- 其他的按照网页中的要求设置好。
这里要强调一下,一定要把Ungrouped Entries下所有Qt相关的文件夹中的msvc2015改成msvc2015_64,因为是要生成64位的相应文件。我某次编译这里没有改,最后测试时会报错。
修改Qt的.pro文件
在Qt的.pro文件中添加PCL相关的include和lib文件路径,具体可以参考 网页1 或者 网页2。
一种更方便的做法是把下面这些包含头文件和链接库的内容放在一个.pri文件里,比如叫做 pcl.pri,放在我的pcl安装目录 D:/PCL1.8.1/ 下:
INCLUDEPATH += D:/PCL1.8.1/include/pcl-1.8\
INCLUDEPATH += D:/PCL1.8.1/include/pcl-1.8/pcl\
INCLUDEPATH += D:/PCL1.8.1/3rdParty/Boost/include/boost-1_64\
INCLUDEPATH += D:/PCL1.8.1/3rdParty/Boost/include/boost-1_64/boost\
INCLUDEPATH += D:/PCL1.8.1/3rdParty/Eigen/eigen3\
INCLUDEPATH += D:/PCL1.8.1/3rd