RGBD-PL-SLAM項(xiàng)目配置
編譯環(huán)境 VS2017 + CMake3.20.2 + win10 20H2 + Windows SDK8.1
1. 目前遇到的問題
- 為什么要編譯這些庫
- 編譯庫以后有什么作用
- 我如何創(chuàng)建一個需要編譯的庫
2. 編譯相關(guān)庫
下載源代碼 -> 新建source、build、install文件夾-> 源代碼拷進(jìn)source里 -> 使用Cmake + VS2017進(jìn)行編譯

2.1 OpenCV-3.4.9

都選擇x64的進(jìn)行編譯

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 或者在項(xiàng)目屬性頁中或通過右鍵單擊解決方案并選擇“重定解決方案目標(biāo)”來更改 SDK 版本。
在VS installer里安裝對應(yīng)版本的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 配置選項(xiàng)
在配置選項(xiàng)里找到它要配置Eigen_3_3_9 VTK 那就先去配置那些庫
下面這堆配置完以后再回來編譯基本ok了
配置VTK,Eigen3,QT,OPENNI等庫 開始編譯等報錯
結(jié)果就全部成功了 還挺開心的把
2.1.4 配置額外庫
OpenCV3.4.1+opencv_contrib編譯:windows 10_ezhchai的博客-CSDN博客
配置完成后發(fā)現(xiàn)有沖突庫,需要刪除
編譯的時候發(fā)現(xiàn)某些庫編譯不出來 修改一下試試
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,這個后面要用
然后貌似編譯成功了
還出現(xiàn)個問題 留個網(wǎng)址VS2017的怪問題--錯誤: 未能完成操作。未指定的錯誤_tanmx219的博客-CSDN博客
2.2 Eigen_3_3_9
Eigen是一個高層次的C ++庫,有效支持線性代數(shù),矩陣和矢量運(yùn)算,數(shù)值分析及其相關(guān)的算法。Eigen是一個開源庫,從3.1.1版本開始遵從MPL2許可。
2.2.1 依賴Eigen適用范圍廣,支持包括固定大小、任意大小的所有矩陣操作,甚至是稀疏矩陣;支持所有標(biāo)準(zhǔn)的數(shù)值類型,并且可以擴(kuò)展為自定義的數(shù)值類型;支持多種矩陣分解及其幾何特征的求解;它不支持的模塊生態(tài)系統(tǒng),提供了許多專門的功能,如非線性優(yōu)化,矩陣功能,多項(xiàng)式解算器,快速傅立葉變換等。
Eigen支持多種編譯環(huán)境,開發(fā)人員對庫中的實(shí)例在多種編譯環(huán)境下經(jīng)過測試,以保證其在不同編譯環(huán)境下的可靠性和實(shí)用性
貌似目前只有這倆
- Boost
- QT
2.2.2 常規(guī)操作
這一行要換成install文件夾,配置好以后再點(diǎn)一下Configure 紅的就白了
然后點(diǎn)Generate生成項(xiàng)目文件
在build目錄下雙擊Eigen3.sln,進(jìn)入解決方案后選擇Debug和Release生成解決方案
這里發(fā)現(xiàn)忘記設(shè)置debug_prefix了,回去cmake設(shè)置一下,這里的選項(xiàng)可能沒用 但是還是設(shè)置一下


然后重新Generate一下
2.2.3 生成解決方案
解決方案不在設(shè)置的目錄下生成文件?一看沒有install項(xiàng)目

然后就好了,搞下一個
2.3 Boost
Boost C++ 庫(Libraries)是一組擴(kuò)展C++功能的經(jīng)過同行評審(Peer-reviewed)且開放源碼程序庫。大多數(shù)的函數(shù)為了能夠以開放源碼、封閉項(xiàng)目的方式運(yùn)作,而許可于Boost軟件許可協(xié)議(Boost Software License)之下。許多Boost的開發(fā)人員是來自C++標(biāo)準(zhǔn)委員會,而部分的Boost庫成為C++的TR1標(biāo)準(zhǔn)之一。
使用這個軟件打開命令行,進(jìn)入當(dāng)前目錄

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中是靜態(tài)庫,include中是頭文件
2.4 flann
FLANN (Fast Approximate Nearest Neighbor Search Library), 快速最近鄰逼近搜索函數(shù)庫。即實(shí)現(xiàn)快速高效匹配。
老操作 選擇source、build,修改install目錄,修改CMAKE_DEBUG_POSTFIX
生成解決方案 生成ALL_BUILD的debug和release,然后生成INSTALL的

2.5 VTK
VTK是非常優(yōu)秀的開源系統(tǒng),專門用于三維計(jì)算機(jī)圖像處理和可視化任務(wù)。
這個庫比較難搞,等下看運(yùn)氣,這個弄完再搞個PCL就好了
老操作 選擇source、build,修改install目錄,修改CMAKE_DEBUG_POSTFIX

把QT勾上 路徑
D:/DevelopTool/Tools/QT/5.12.10/msvc2017_64/lib/cmake/Qt5
多點(diǎn)幾次Configure 讓紅的變白
這編譯至少得半小時吧... 等著好了
2.6 PCL
PCL(Point Cloud Library)是在吸收了前人點(diǎn)云相關(guān)研究基礎(chǔ)上建立起來的大型跨平臺開源C++編程庫,它實(shí)現(xiàn)了大量點(diǎn)云相關(guān)的通用算法和高效數(shù)據(jù)結(jié)構(gòu),涉及到點(diǎn)云獲取、濾波、分割、配準(zhǔn)、檢索、特征提取、識別、追蹤、曲面重建、可視化等。支持多種操作系統(tǒng)平臺,可在Windows、Linux、Android、Mac OS X、部分嵌入式實(shí)時系統(tǒng)上運(yùn)行。如果說OpenCV是2D信息獲取與處理的結(jié)晶,那么PCL就在3D信息獲取與處理上具有同等地位,PCL是BSD授權(quán)方式,可以免費(fèi)進(jìn)行商業(yè)和學(xué)術(shù)應(yīng)用。
上面弄的這些基本都是給PCL準(zhǔn)備的,開搞
老操作 選擇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 發(fā)現(xiàn)居然在PCL的source中的cmake里,這可有點(diǎn)呆,現(xiàn)在先改一下吧
set(EIGEN_INCLUDE_DIR "D:/DevelopTool/CPP_LIB/install/eigen_3_3_9/include/eigen3")
然后過了
2.6.4 配置Boost
應(yīng)該和上面一個問題,find文件里路徑不對
新建條目Boost_ROOT 類型Path 內(nèi)容C:/Boost
2.6.5 編譯項(xiàng)目
和VTK差不多慢,還卡我電腦
先等著,看報不報錯,大概率會因?yàn)闆]引用庫報錯
生成Debug
10>已完成生成項(xiàng)目“pcl_kdtree.vcxproj”的操作 - 失敗。
90>已完成生成項(xiàng)目“pcl_registration.vcxproj”的操作 - 失敗。
91>已完成生成項(xiàng)目“pcl_segmentation.vcxproj”的操作 - 失敗。
都是缺flann,調(diào)整一下這三個項(xiàng)目的配置
右鍵項(xiàng)目 屬性 鏈接器 輸入 添加 幾個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進(jìn)行封裝的輕量級的OpenGL輸入/輸出和視頻顯示的庫。可以用于3D視覺和3D導(dǎo)航的視覺圖,可以輸入各種類型的視頻、并且可以保留視頻和輸入數(shù)據(jù)用于debug。
它要從git 下載源碼進(jìn)行編譯?
Building Custom Rule D:/DevelopTool/CPP_LIB/source/Pangolin/external/CMakeLists.txt
Performing download step (git clone) for '__glew'
Cloning into '__glew'...
失敗了 我一看它要依賴Python? 能不能不依賴的
8>已完成生成項(xiàng)目“SimpleDisplayImage.vcxproj”的操作 - 失敗。
13>LINK : fatal error LNK1104: 無法打開文件“python38_d.lib”
13>已完成生成項(xiàng)目“SimpleVideo.vcxproj”的操作 - 失敗。
11>LINK : fatal error LNK1104: 無法打開文件“python38_d.lib”
11>已完成生成項(xiàng)目“SimpleRecord.vcxproj”的操作 - 失敗。
9>LINK : fatal error LNK1104: 無法打開文件“python38_d.lib”
9>已完成生成項(xiàng)目“SimpleMultiDisplay.vcxproj”的操作 - 失敗。
10>LINK : fatal error LNK1104: 無法打開文件“python38_d.lib”
10>已完成生成項(xiàng)目“SimplePlot.vcxproj”的操作 - 失敗。
7>LINK : fatal error LNK1104: 無法打開文件“python38_d.lib”
7>已完成生成項(xiàng)目“SimpleDisplay.vcxproj”的操作 - 失敗。
12>LINK : fatal error LNK1104: 無法打開文件“python38_d.lib”
12>已完成生成項(xiàng)目“SimpleRepeatVideo.vcxproj”的操作 - 失敗。
6>LINK : fatal error LNK1104: 無法打開文件“python38_d.lib”
6>已完成生成項(xiàng)目“HelloPangolin.vcxproj”的操作 - 失敗。
14>LINK : fatal error LNK1104: 無法打開文件“python38_d.lib”
14>已完成生成項(xiàng)目“VideoViewer.vcxproj”的操作 - 失敗。
還是依賴一下 python更改 添加debug(網(wǎng)上找的圖)
然后還有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>已完成生成項(xiàng)目“__zlib.vcxproj”的操作 - 失敗。
這個異常,是指你在本地git pull拉取了代碼后,你stash起來的代碼和你git pull下來的代碼有沖突,因?yàn)橛袥_突,stash的代碼在git pop之后會保留一份備用,防止后續(xù)還需要到stash的代碼。
先暫時不管了把 到時候看有沒有影響
2.8 Qhull
Qhull(http://www.qhull.org/)是一個強(qiáng)大的計(jì)算幾何庫,可以用于計(jì)算高維的convex hull, Delaunay triangulation, Voronoi diagram等
下載 和上面一樣操作一下就好了
3. 修改項(xiàng)目
3.1 下載源碼
RGBD的PL-SLAM項(xiàng)目
https://github.com/maxee1900/RGBD-PL-SLAM
原版的PL-SLAM項(xiàng)目
https://github.com/HarborC/PL-SLAM
3.2 CMAKE
沒啥問題,就還是用GUI生成一下
3.3 構(gòu)建工程
首先要把原版的PL-SLAM項(xiàng)目中,src文件夾復(fù)制到RGBD的項(xiàng)目里,并把里面文件的名字改成.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
把unistd.h 替換成io.h 即可
3.2.3 項(xiàng)目缺一些引用
3>d:\project\slam\source\rgbd-pl-slam\include\auxiliar.h(19): fatal error C1083: 無法打開包括文件: “eigen3/Eigen/Core”: No such file or directory
右鍵項(xiàng)目 屬性 VC++目錄 包含目錄
添加 D:\DevelopTool\CPP_LIB\install\eigen_3_3_9\include
4. 項(xiàng)目報錯
先保存一下然后一個個改吧
網(wǎng)上說可能是編碼問題 拉莫改一下編碼試試看
4.1 error C2872: “ACCESS_MASK”: 不明確的符號
修改方法 把所有using namespace cv都刪掉 然后把使用cv的加上cv::
因?yàn)閏v和windows里都有這個ACCESS_MASK
4.2 error C2039: “mnId”: 不是“ORB_SLAM2::KeyFrame”的成員
我懷疑這也是編碼問題 先去修改下試試
把編碼換成UTF-8-BOM 回車換成CRLF
4.3 System.cpp里定義的方法和System.h不一樣
這回又得找下cpp了
發(fā)現(xiàn)是項(xiàng)目文件不匹配 卒