RGBD-PL-SLAM项目配置
编译环境 VS2017 + CMake3.20.2 + win10 20H2 + Windows SDK8.1
1. 目前遇到的问题
- 为什么要编译这些库
- 编译库以后有什么作用
- 我如何创建一个需要编译的库
2. 编译相关库
下载源代码 -> 新建source、build、install文件夹-> 源代码拷进source里 -> 使用Cmake + VS2017进行编译
2.1 OpenCV-3.4.9
都选择x64的进行编译
2.1.1 缺少Window SDK 8.1
上来就遇到一个问题,那就装呗
D:\DevelopTool\Visual Studio\2017\IDE\Common7\IDE\VC\VCTargets\Microsoft.Cpp.WindowsSDK.targets(46,5): error MSB8036: 找不到 Windows SDK 版本8.1。请安装所需的版本的 Windows SDK 或者在项目属性页中或通过右键单击解决方案并选择“重定解决方案目标”来更改 SDK 版本。
在VS installer里安装对应版本的Window SDK版本
2.1.2 ffmepg
FFMPEG: Download: opencv_ffmpeg.dll
FFMPEG: Download: opencv_ffmpeg_64.dll
FFMPEG: Download: ffmpeg_version.cmake
这几个要提前下载好,下载起来比较慢,或者翻下墙
2.1.3 配置选项
在配置选项里找到它要配置Eigen_3_3_9 VTK 那就先去配置那些库
下面这堆配置完以后再回来编译基本ok了
配置VTK,Eigen3,QT,OPENNI等库 开始编译等报错
结果就全部成功了 还挺开心的把
2.1.4 配置额外库
OpenCV3.4.1+opencv_contrib编译:windows 10_ezhchai的博客-CSDN博客
配置完成后发现有冲突库,需要删除
编译的时候发现某些库编译不出来 修改一下试试
49>LINK : fatal error LNK1104: 无法打开文件“..\..\lib\Debug\opencv_quality349_d.lib”
88>LINK : fatal error LNK1104: 无法打开文件“..\..\lib\Debug\opencv_ximgproc349_d.lib”
92>LINK : fatal error LNK1104: 无法打开文件“..\..\lib\Debug\opencv_xfeatures2d349_d.lib”
96>LINK : fatal error LNK1104: 无法打开文件“..\..\lib\Debug\opencv_stereo349_d.lib”
114>LINK : fatal error LNK1104: 无法打开文件“..\..\lib\Debug\opencv_mcc349_d.lib”
感觉是库冲突了,于是把所有模块都删了 除了line_descriptor,这个后面要用
然后貌似编译成功了
还出现个问题 留个网址VS2017的怪问题--错误: 未能完成操作。未指定的错误_tanmx219的博客-CSDN博客
2.2 Eigen_3_3_9
Eigen是一个高层次的C ++库,有效支持线性代数,矩阵和矢量运算,数值分析及其相关的算法。Eigen是一个开源库,从3.1.1版本开始遵从MPL2许可。
2.2.1 依赖Eigen适用范围广,支持包括固定大小、任意大小的所有矩阵操作,甚至是稀疏矩阵;支持所有标准的数值类型,并且可以扩展为自定义的数值类型;支持多种矩阵分解及其几何特征的求解;它不支持的模块生态系统,提供了许多专门的功能,如非线性优化,矩阵功能,多项式解算器,快速傅立叶变换等。
Eigen支持多种编译环境,开发人员对库中的实例在多种编译环境下经过测试,以保证其在不同编译环境下的可靠性和实用性
貌似目前只有这俩
- Boost
- QT
2.2.2 常规操作
这一行要换成install文件夹,配置好以后再点一下Configure 红的就白了
然后点Generate生成项目文件
在build目录下双击Eigen3.sln,进入解决方案后选择Debug和Release生成解决方案
这里发现忘记设置debug_prefix了,回去cmake设置一下,这里的选项可能没用 但是还是设置一下
然后重新Generate一下
2.2.3 生成解决方案
解决方案不在设置的目录下生成文件?一看没有install项目
然后就好了,搞下一个
2.3 Boost
Boost C++ 库(Libraries)是一组扩展C++功能的经过同行评审(Peer-reviewed)且开放源码程序库。大多数的函数为了能够以开放源码、封闭项目的方式运作,而许可于Boost软件许可协议(Boost Software License)之下。许多Boost的开发人员是来自C++标准委员会,而部分的Boost库成为C++的TR1标准之一。
使用这个软件打开命令行,进入当前目录
b2 install --toolset=msvc-14.1 --without-python link=static runtime-link=shared runtime-link=static threading=multi debug release address-model=64
然后就好了 自动生成在C:/Boost文件夹下,路径不改了 lib中是静态库,include中是头文件
2.4 flann
FLANN (Fast Approximate Nearest Neighbor Search Library), 快速最近邻逼近搜索函数库。即实现快速高效匹配。
老操作 选择source、build,修改install目录,修改CMAKE_DEBUG_POSTFIX
生成解决方案 生成ALL_BUILD的debug和release,然后生成INSTALL的
2.5 VTK
VTK是非常优秀的开源系统,专门用于三维计算机图像处理和可视化任务。
这个库比较难搞,等下看运气,这个弄完再搞个PCL就好了
老操作 选择source、build,修改install目录,修改CMAKE_DEBUG_POSTFIX
把QT勾上 路径
D:/DevelopTool/Tools/QT/5.12.10/msvc2017_64/lib/cmake/Qt5
多点几次Configure 让红的变白
这编译至少得半小时吧... 等着好了
2.6 PCL
PCL(Point Cloud Library)是在吸收了前人点云相关研究基础上建立起来的大型跨平台开源C++编程库,它实现了大量点云相关的通用算法和高效数据结构,涉及到点云获取、滤波、分割、配准、检索、特征提取、识别、追踪、曲面重建、可视化等。支持多种操作系统平台,可在Windows、Linux、Android、Mac OS X、部分嵌入式实时系统上运行。如果说OpenCV是2D信息获取与处理的结晶,那么PCL就在3D信息获取与处理上具有同等地位,PCL是BSD授权方式,可以免费进行商业和学术应用。
上面弄的这些基本都是给PCL准备的,开搞
老操作 选择source、build,修改install目录,修改CMAKE_DEBUG_POSTFIX
2.6.1 配置FLANN
2.6.2 配置VTK
D:\DevelopTool\CPP_LIB\install\VTK_8_2_0\lib\cmake\vtk-8.2
和上面一样,选择有XXXConfig.cmake的路径即可
2.6.3 配置EIGEN
CMake Error at cmake/Modules/FindEigen.cmake:24 (file):
file failed to open for reading (No such file or directory):
D:/SDK/CPP_LIB/install/eigen-3.3.9/include/eigen3/Eigen/src/Core/util/Macros.h
Call Stack (most recent call first):
CMakeLists.txt:301 (find_package)
提示找不到文件,我一看就是路径不对,不知道是哪个地方生成的,得改一下
找一下FindEigen.cmake 发现居然在PCL的source中的cmake里,这可有点呆,现在先改一下吧
set(EIGEN_INCLUDE_DIR "D:/DevelopTool/CPP_LIB/install/eigen_3_3_9/include/eigen3")
然后过了
2.6.4 配置Boost
应该和上面一个问题,find文件里路径不对
新建条目Boost_ROOT 类型Path 内容C:/Boost
2.6.5 编译项目
和VTK差不多慢,还卡我电脑
先等着,看报不报错,大概率会因为没引用库报错
生成Debug
10>已完成生成项目“pcl_kdtree.vcxproj”的操作 - 失败。
90>已完成生成项目“pcl_registration.vcxproj”的操作 - 失败。
91>已完成生成项目“pcl_segmentation.vcxproj”的操作 - 失败。
都是缺flann,调整一下这三个项目的配置
右键项目 属性 链接器 输入 添加 几个lib
D:\DevelopTool\CPP_LIB\install\flann_1_9_1\lib\flann_d.lib
D:\DevelopTool\CPP_LIB\install\flann_1_9_1\lib\flann_s_d.lib
D:\DevelopTool\CPP_LIB\install\flann_1_9_1\lib\flann_cpp_s_d.lib
生成Release
11>kdtree_flann.obj : error LNK2001: 无法解析的外部符号 LZ4_resetStreamHC
11>kdtree_flann.obj : error LNK2001: 无法解析的外部符号 LZ4_setStreamDecode
11>kdtree_flann.obj : error LNK2001: 无法解析的外部符号 LZ4_decompress_safe_continue
11>kdtree_flann.obj : error LNK2001: 无法解析的外部符号 LZ4_decompress_safe
11>kdtree_flann.obj : error LNK2001: 无法解析的外部符号 LZ4_compress_HC_continue
11>D:\DevelopTool\CPP_LIB\build\PCL_1_10_0\bin\pcl_kdtree.dll : fatal error LNK1120: 5 个无法解析的外部命令
92>gicp6d.obj : error LNK2001: 无法解析的外部符号 LZ4_resetStreamHC
92>gicp6d.obj : error LNK2001: 无法解析的外部符号 LZ4_setStreamDecode
92>gicp6d.obj : error LNK2001: 无法解析的外部符号 LZ4_decompress_safe_continue
92>gicp6d.obj : error LNK2001: 无法解析的外部符号 LZ4_decompress_safe
92>gicp6d.obj : error LNK2001: 无法解析的外部符号 LZ4_compress_HC_continue
92>D:\DevelopTool\CPP_LIB\build\PCL_1_10_0\bin\pcl_registration.dll : fatal error LNK1120: 5 个无法解析的外部命令
93>unary_classifier.obj : error LNK2001: 无法解析的外部符号 LZ4_resetStreamHC
93>unary_classifier.obj : error LNK2001: 无法解析的外部符号 LZ4_setStreamDecode
93>unary_classifier.obj : error LNK2001: 无法解析的外部符号 LZ4_decompress_safe_continue
93>unary_classifier.obj : error LNK2001: 无法解析的外部符号 LZ4_decompress_safe
93>unary_classifier.obj : error LNK2001: 无法解析的外部符号 LZ4_compress_HC_continue
93>D:\DevelopTool\CPP_LIB\build\PCL_1_10_0\bin\pcl_segmentation.dll : fatal error LNK1120: 5 个无法解析的外部命令
和上面一样 加上flann_s.lib等lib在链接器里就好了
D:\DevelopTool\CPP_LIB\install\flann_1_9_1\lib\flann.lib
D:\DevelopTool\CPP_LIB\install\flann_1_9_1\lib\flann_s.lib
D:\DevelopTool\CPP_LIB\install\flann_1_9_1\lib\flann_cpp_s.lib
2.7 Pangolin
Pangolin是对OpenGL进行封装的轻量级的OpenGL输入/输出和视频显示的库。可以用于3D视觉和3D导航的视觉图,可以输入各种类型的视频、并且可以保留视频和输入数据用于debug。
它要从git 下载源码进行编译?
Building Custom Rule D:/DevelopTool/CPP_LIB/source/Pangolin/external/CMakeLists.txt
Performing download step (git clone) for '__glew'
Cloning into '__glew'...
失败了 我一看它要依赖Python? 能不能不依赖的
8>已完成生成项目“SimpleDisplayImage.vcxproj”的操作 - 失败。
13>LINK : fatal error LNK1104: 无法打开文件“python38_d.lib”
13>已完成生成项目“SimpleVideo.vcxproj”的操作 - 失败。
11>LINK : fatal error LNK1104: 无法打开文件“python38_d.lib”
11>已完成生成项目“SimpleRecord.vcxproj”的操作 - 失败。
9>LINK : fatal error LNK1104: 无法打开文件“python38_d.lib”
9>已完成生成项目“SimpleMultiDisplay.vcxproj”的操作 - 失败。
10>LINK : fatal error LNK1104: 无法打开文件“python38_d.lib”
10>已完成生成项目“SimplePlot.vcxproj”的操作 - 失败。
7>LINK : fatal error LNK1104: 无法打开文件“python38_d.lib”
7>已完成生成项目“SimpleDisplay.vcxproj”的操作 - 失败。
12>LINK : fatal error LNK1104: 无法打开文件“python38_d.lib”
12>已完成生成项目“SimpleRepeatVideo.vcxproj”的操作 - 失败。
6>LINK : fatal error LNK1104: 无法打开文件“python38_d.lib”
6>已完成生成项目“HelloPangolin.vcxproj”的操作 - 失败。
14>LINK : fatal error LNK1104: 无法打开文件“python38_d.lib”
14>已完成生成项目“VideoViewer.vcxproj”的操作 - 失败。
还是依赖一下 python更改 添加debug(网上找的图)
然后还有1失败??
1>The stash entry is kept in case you need it again.
1>CMake Error at D:/DevelopTool/CPP_LIB/build/Pangolin/external/zlib/tmp/__zlib-gitupdate.cmake:264 (message):
1>
1>
1> Failed to unstash changes in:
1> 'D:/DevelopTool/CPP_LIB/build/Pangolin/external/zlib/src/__zlib'.
1>
1> You will have to resolve the conflicts manually
1>
1>
1>已完成生成项目“__zlib.vcxproj”的操作 - 失败。
这个异常,是指你在本地git pull拉取了代码后,你stash起来的代码和你git pull下来的代码有冲突,因为有冲突,stash的代码在git pop之后会保留一份备用,防止后续还需要到stash的代码。
先暂时不管了把 到时候看有没有影响
2.8 Qhull
Qhull(http://www.qhull.org/)是一个强大的计算几何库,可以用于计算高维的convex hull, Delaunay triangulation, Voronoi diagram等
下载 和上面一样操作一下就好了
3. 修改项目
3.1 下载源码
RGBD的PL-SLAM项目
https://github.com/maxee1900/RGBD-PL-SLAM
原版的PL-SLAM项目
https://github.com/HarborC/PL-SLAM
3.2 CMAKE
没啥问题,就还是用GUI生成一下
3.3 构建工程
首先要把原版的PL-SLAM项目中,src文件夹复制到RGBD的项目里,并把里面文件的名字改成.cpp
3.2.1 提示 -Wno-deprecated-declarations 不存在
在CmakeList里把这个去掉就可以编译了
3.2.2 opencv缺文件
-
无法打开包括文件: “opencv2/line_descriptor/descriptor.hpp”: No such file or directory
需要在OpenCV中包含opencv_contrib这个库,不然没有这个东西。
-
无法打开包括文件: “unistd.h”: No such file or directory
Python 安装zbar-py时出现 无法打开包括文件: “unistd.h” no such file or directory - 何大卫 - 博客园 (cnblogs.com)
把unistd.h 替换成io.h 即可
3.2.3 项目缺一些引用
3>d:\project\slam\source\rgbd-pl-slam\include\auxiliar.h(19): fatal error C1083: 无法打开包括文件: “eigen3/Eigen/Core”: No such file or directory
右键项目 属性 VC++目录 包含目录
添加 D:\DevelopTool\CPP_LIB\install\eigen_3_3_9\include
4. 项目报错
先保存一下然后一个个改吧
网上说可能是编码问题 拉莫改一下编码试试看
4.1 error C2872: “ACCESS_MASK”: 不明确的符号
修改方法 把所有using namespace cv都删掉 然后把使用cv的加上cv::
因为cv和windows里都有这个ACCESS_MASK
4.2 error C2039: “mnId”: 不是“ORB_SLAM2::KeyFrame”的成员
我怀疑这也是编码问题 先去修改下试试
把编码换成UTF-8-BOM 回车换成CRLF
4.3 System.cpp里定义的方法和System.h不一样
这回又得找下cpp了
发现是项目文件不匹配 卒