本文在參考一下兩篇博文后,自行編譯PCL1.8.0點雲庫,並正常使用,這兩篇博文對編譯過程寫的非常詳盡,但是在細節上存在個別小問題,這里也指出糾正。更新日期:2017.4.6
http://www.cnblogs.com/findumars/p/6375738.html
https://oncemore2020.github.io/blog/pcl-compile/
提要:
PCL(Point Cloud Library) 1.8.0 版本發布了,相對 1.7.x 版本,帶來了大量的 更新,其源碼可以從 pcl 1.8.0 release 下載。本文記錄如何在 Windows 上使用 Visual Studio C++ 編譯器編譯和配置 PCL 1.8.0 版本。
筆者配置環境:
PCL1.8.0+64bit Win10+VS2015+CMaker3.7.2編譯32位PCL庫
若配置環境不同,應稍作更改,不過基本上步驟相同。
一、准備工作
首先確保安裝了以下工具:
Visual Studio Enterprise 2015(Update3,其他版本應該也同樣可以)
CMake3.7.2(cmake-3.7.2-win64-x64.msi,理論上>=3.6.0版本即可)
Microsoft MPI v7
https://www.microsoft.com/en-us/download/details.aspx?id=49926
Qt 5.7.0 for Windows 64-bit(筆者這里沒有使用Qt,若想用Qt的朋友可參考以上網址,只是在編譯過程中的相關選項加入Qt即可)
OpenNI 2.2.0.33 Beta(一般用OpenNI-Windows-x86-2.2.msi)
http://www.openni.ru/openni-sdk/index.html
注意在 Microsoft MPI v7 的下載頁面需要選定 msmpisdk.msi 和 MSMpiSetup.exe,兩個軟件都需要安裝。
配置說明:
1、Microsoft MPI v7是Microsoft MPI SDK和Microsoft MPI
msmpisdk.msi安裝在D:\Program Files (x86)\Microsoft SDKs\MPI\
MSMpiSetup.exe安裝在D:\Program Files\Microsoft MPI\
2、OpenNI 2.2.0.33 Beta
安裝在D:\Program Files (x86)\OpenNI2\
下載以下軟件/庫的源代碼(第三方庫版本以官方推薦版本為主,與PCL 1.8.0 All-in-one Installer MSVC2015 Win32第三方庫版本相同):
PCL 1.8.0
Boost 1.61.0
Eigen 3.2.8
FLANN 1.8.4
VTK 7.0.0
Qhull 2015.2
避錯貼士
由於編譯過程繁雜,很容易碰到錯誤,目前提供如下貼士:
1、Windows 10 系統不能安裝 Windows Driver Kit,否則會導致編譯 Boost 時出錯
2、系統不能安裝 Anaconda 2/3,否則編譯 FLANN 時 HDF 相關設置會導致編譯出錯
3、編譯時盡量不要選擇編譯例程(examples)和測試(global test),否則很容易出問題
另外,本文均使用 Visual Studio C++ 14.0 win32 編譯源碼,也可以使用默認的 64位編譯器,當然使用 Visual Studio 2013 版本配套的 C++ 12.0 編譯器理論上也是可以的。后文用到的工具以及編譯選項均假定為 32 位編譯器,如使用其他版本或 64 位的編譯器,注意替換。
二、編譯過程詳解
1、編譯Boost
Boost 庫提供標准庫兼容的 C++ 運算庫,許多特性逐漸加入到新的 C++ 標准中(C++11、C++14、C++17)。
解壓 Boost 源碼到 boost_1_61_0,本機目錄 D:\lib\boost_1_61_0。
注意: 下文均將源代碼解壓到 D:\lib 目錄中,不做另外說明。
使用文本編輯器編輯 D:\lib\boost_1_61_0\tools\build\src\tools\mpi.jam 文件(使用以下代碼替換指定行數的代碼):
注意: Windows 下推薦 Nodepad++ 或者其他代碼編輯器(Visual Studio(Code)、Sublime Text、Atom等),不要 使用記事本。
249-251 行
local microsoft_mpi_sdk_path = "D:\\Program Files (x86)\\Microsoft SDKs\\MPI" ;
local microsoft_mpi_path = "D:\\Program Files\\Microsoft MPI" ;
if [ GLOB $(microsoft_mpi_sdk_path)\\Include : mpi.h ]
260-262 行
options = <include>$(microsoft_mpi_sdk_path)/Include
<address-model>64:<library-path>$(microsoft_mpi_sdk_path)/Lib/x64
<library-path>$(microsoft_mpi_sdk_path)/Lib/x86
268 行
.mpirun = "\"$(microsoft_mpi_path)\\Bin\\mpiexec.exe"\" ;
保存文件后關閉。
使用管理員權限啟動 VS2015 x86本機工具命令提示符,進入到 Boost 源代碼解壓目錄,然后運行其中的 bootstrap.bat 腳本。
D:
cd lib\boost_1_61_0
bootstrap.bat
說明: 第一行切換到 D:\,第二行切換到 Boost 源代碼目錄,第三行運行 bootstrap.bat。
結束后,將會在目錄中生成 project-config.jam 文件,使用文本編輯器打開,在第 4 行添加
using mpi ;
繼續在 VS2015 x86本機工具命令提示符中輸入
b2.exe toolset=msvc-14.0 address-model=32 --build-dir=build\x86 install --prefix="D:\lib\Boost" -j8
說明: --prefix= 設置編譯輸出目錄,默認也在 D:\lib 中,Boost 對應的為 D:\lib\Boost,其他庫的編譯輸出目錄命名類似。
等待編譯完成。編譯成功后添加用戶變量 BOOST_ROOT 為 D:\lib\Boost。
注意:這里編譯完成后,完成對Boost庫的編譯工作,不過最后的信息可能和顯示有大量的failed updating targets,這是由於系統中缺少部分組建庫導致的,不過不用擔心,如果配置過程沒有問題,PCL所需的Boost庫基本都以完成編譯。
2、編譯Eigen
Eigen 主要用於矩陣運算。
解壓 Eigen 源碼壓縮包到 D:\lib\eigen-eigen-07105f7124f9。
啟動 CMake,設定源碼目錄和構建目錄
Where is the source code: D:\lib\eigen-eigen-07105f7124f9
Where to build the binaries: D:\lib\eigen-eigen-07105f7124f9\build
點擊 Configure,在彈出的對話框中將 Specify the generator for this project 修改為 Visual Studio 14 2015,然后點擊 Finish 完成第一次配置。
檢查以下配置項:
CMAKE_INSTALL_PREFIX: D:\lib\Eigen
再次 Configure 后點擊 Generate 在 build 目錄中生成 VS 解決方案。
使用管理員權限啟動 Visual Studio,通過 File | Open | Project/Solution 菜單打開 D:\lib\eigen-eigen-07105f7124f9\build\Eigen.sln 解決方案,在 Solution Explorer 中選定 ALL_BUILD,右鍵選擇 Build 開始構建源碼,構建完成后,再選定 INSTALL,然后右鍵選擇 Build 完成二進制文件的安裝。
構建成功后生成的文件在 D:\lib\Eigen 文件夾中。
添加用戶變量 EIGEN_ROOT 為 D:\lib\Eigen。
3、編譯FLANN
FLANN 用於快速最近鄰運算,在點雲圖像的處理過程中會涉及到大量的鄰域計算。
解壓 FLANN 源碼壓縮包到 D:\lib\flann-1.8.4-src。
啟動 CMake,設定源碼目錄和構建目錄
Where is the source code: D:\lib\flann-1.8.4-src
Where to build the binaries: D:\lib\flann-1.8.4-src\build
點擊 Configure,在彈出的對話框中將 Specify the generator for this project 修改為 Visual Studio 14 2015,然后點擊 Finish 完成第一次配置。
檢查以下配置項(☐ 表示取消選定,☑ 表示選定):
BUILD_MATLAB_BINDINGS: ☐
BUILD_PYTHON_BINDINGS: ☐
CMAKE_CONFIGURATION_TYPES: Debug;Release
CMAKE_INSTALL_PREFIX: D:/lib/FLANN
再次點擊 Configure 后,點擊 Add Entry 添加一個配置項,該配置項的值如下:
Name: CMAKE_DEBUG_POSTFIX
Type: STRING
Value: -gd
再次點擊 Configure 后點擊 Generate 生成VS解決方案。
使用文本編輯器修改源文件 D:\lib\flann-1.8.4-src\src\cpp\flann\util\serialization.h,在第 92 行下面添加
#ifdef _MSC_VER
BASIC_TYPE_SERIALIZER( unsigned __int64 );
#endif
使用管理員權限啟動 Visual Studio,通過 File | Open | Project/Solution 菜單打開 D:\lib\flann-1.8.4-src\build\flann.sln 解決方案。
在 Debug 模式下,在 Solution Explorer 中選定 ALL_BUILD,右鍵選擇 Build 開始構建源碼,構建完成后選定 INSTALL,再右鍵選擇 Build 將編譯生成的文件安裝到指定目錄(CMAKE_INSTALL_PREFIX)。
然后再切換到 Release 模式,在 Solution Explorer 中選定 ALL_BUILD,右鍵選擇 Build 開始構建源碼,構建完成后選定 INSTALL,再右鍵選擇 Build 將編譯生成的文件安裝到指定目錄。
這樣將生成 Release 版本和 Debug 版本的庫文件和動態鏈接庫。
編譯成功后添加用戶變量 FLANN_ROOT 為 D:\lib\FLANN,在變量 Path 中添加 %FLANN_ROOT%\bin。
4、編譯VTK
VTK 主要用於三維點雲數據的可視化,PCL 的可視化組件依賴於 VTK。
解壓 VTK 源代碼到 D:\lib\VTK-7.0.0。
啟動 CMake,設定源碼目錄和構建目錄
Where is the source code: D:\lib\VTK-7.0.0
Where to build the binaries: D:\lib\VTK-7.0.0\build
點擊 Configure,在彈出的對話框中將 Specify the generator for this project 修改為 Visual Studio 14 2015,然后點擊 Finish 完成第一次配置。
檢查以下配置項:
CMAKE_CONFIGURATION_TYPES: Debug;Release
CMAKE_CXX_MP_FLAG: ☑
CMAKE_INSTALL_PREFIX: D:\lib\VTK
點擊 Add Entry 添加一個配置項,配置項的值如下:
Name: CMAKE_DEBUG_POSTFIX
Type: STRING
Value: -gd
再次點擊 Configure 后點擊 Generate 生成 VS 解決方案。
使用管理員權限啟動 Visual Studio,通過 File | Open | Project/Solution 菜單打開 D:\lib\VTK-7.0.0\build\VTK.sln 解決方案。
在 Debug 模式下,在 Solution Explorer 中選定 ALL_BUILD,右鍵選擇 Build 構建源代碼,構建完成后 選定 INSTALL,再右鍵選擇 Build 將編譯生成的文件安裝到指定位置。
切換為 Release 模式,在 Solution Explorer 中選定 ALL_BUILD,右鍵選擇 Build 構建源代碼,構建完成后,選定 INSTALL,再右鍵選擇 Build 將編譯生成的文件安裝到指定位置。
這樣將生成 Release 版本和 Debug 版本的庫文件和動態鏈接庫。
構建成功后,添加用戶變量 VTK_DIR 為 D:\lib\VTK,在變量 Path 中添加 %VTK_DIR%\bin。
5、編譯Qhull
Qhull 用於凸包計算。
解壓 Qhull 源代碼到 D:\lib\qhull-2015.2。
刪除源代碼目錄中的 build 目錄中的內容,然后啟動 CMake,設定源碼目錄和構建目錄
Where is the source code: D:\lib\qhull-2015.2
Where to build the binaries: D:\lib\qhull-2015.2\build
點擊 Configure,在彈出的對話框中將 Specify the generator for this project 修改為 Visual Studio 14 2015 Win64,然后點擊 Finish 完成第一次配置。
檢查以下配置項:
CMAKE_CONFIGURATION_TYPES: Debug;Release
CMAKE_INSTALL_PREFIX: D:/lib/Qhull
點擊 Add Entry 添加一個配置項,配置項的值如下:
Name: CMAKE_DEBUG_POSTFIX
Type: STRING
Value: _d
使用管理員權限啟動 Visual Studio,通過 File | Open | Project/Solution 菜單打開 D:\lib\qhull-2015.2\build\qhull.sln 解決方案。
在 Debug 模式下,從 Solution Explorer 中選定 ALL_BUILD,右鍵選擇 Build 構建源代碼,構建完成后選定 INSTALL,再右鍵選擇 Build 將構建生成的文件安裝到指定位置。
切換為 Release 模式,在 Solution Explorer 中選定 ALL_BUILD,右鍵選擇 Build 構建源代碼,構建完成后選定 INSTALL,再右鍵選擇 Build 將構建生成的文件安裝到指定位置。
這樣將生成 Release 版本和 Debug 版本的庫文件和動態鏈接庫。
編譯成功后添加用戶變量 QHULL_ROOT 為 D:\lib\Qhull,在變量 Path 中添加 %QHULL_ROOT%\bin。
6、編譯PCL
解壓 PCL 源代碼到 D:\lib\PCL-1.8.0 目錄。
注意: 下面的修改是一個 bug,在 Github 倉庫里已經修復(#1635),但是 PCL 1.8.0 版本的源代碼還沒有更新。所以可能更新版本的 PCL 1.8.x 就不存在以下的問題了。
使用文本編輯器編輯 D:\lib\PCL-1.8.0\visualization\src\pcl_visualizer.cpp:
將第 1495 行替換為:
if (!pcl::visualization::getColormapLUT (static_cast<LookUpTableRepresentationProperties>(static_cast<int>(value)), table))
將第 1741 行替換為:
getColormapLUT (static_cast<LookUpTableRepresentationProperties>(static_cast<int>(value)), table);
這里注意:這時修改了pcl_visualizer.cpp文件內容,在CMake生成源代碼后,在pcl_visualization項目中的pcl_visualizer.cpp文件的內容仍然沒有改變,在生成源代碼后,對PCL.sln進行編譯前,應進行同樣的更改。
啟動 CMake,設定源碼目錄和構建目錄
Where is the source code: D:\lib\pcl-pcl-1.8.0
Where to build the binaries: D:\lib\pcl-pcl-1.8.0\build
點擊 Configure,在彈出的對話框中將 Specify the generator for this project 修改為 Visual Studio 14 2015 Win64,然后點擊 Finish 完成第一次配置。
此時可能會有CMaker語法非法的問題,應將D:\lib\VTK\lib\cmake\vtk-7.0\VTKConfig.cmake的第9行和第14行
第9行修改為:
set(_vtk_installed_prefix "D:/lib/VTK/lib/cmake/vtk-7.0")
第14行修改為:
set(VTK_INSTALL_PREFIX "D:/lib/VTK")
將 Grouped 和 Advanced 選定,然后檢查以下配置項:
Ungrouped Entries
EIGEN_INCLUDE_DIR: D:/lib/Eigen/include/eigen3
VTK_DIR: D:/lib/VTK/lib/cmake/vtk-7.0
BUILD
BUILD_2d: ☑(check)
BUILD_CUDA: ☐(uncheck)
BUILD_GPU: ☐(uncheck)
BUILD_all_in_one_installer: ☑(check)
BUILD_apps: ☐(uncheck)
BUILD_common: ☑(check)
BUILD_example: ☐(uncheck)
BUILD_features: ☑(check)
BUILD_filters: ☑(check)
BUILD_geometry:☑(check)
BUILD_global_tests: ☐(uncheck)
BUILD_io: ☑(check)
BUILD_kdtree: ☑(check)
BUILD_keypoints: ☑(check)
BUILD_octree: ☑(check)
BUILD_outofcore: ☑(check)
BUILD_people: ☑(check)
BUILD_recognition: ☑(check)
BUILD_registration: ☑(check)
BUILD_sample_consensus: ☑(check)
BUILD_search: ☑(check)
BUILD_segmentation: ☑(check)
BUILD_simulation: ☐(uncheck)
BUILD_stereo: ☑(check)
BUILD_surface: ☑(check)
BUILD_surface_on_nurbs: ☑(check)
BUILD_tools: ☑(check)
BUILD_tracking: ☑(check)
BUILD_visualization: ☑(check)
Boost(前面兩個參考博文的這里都有問題,請注意)
Boost_DATE_TIME_LIBRARY_DEBUG: D:\lib\Boost\lib\libboost_date_time-vc140-mt-gd-1_61.lib
Boost_DATE_TIME_LIBRARY_RELEASE: D:\lib\Boost\lib\libboost_date_time-vc140-mt-1_61.lib
Boost_FILESYSTEM_LIBRARY_DEBUG:D:\lib\Boost\lib\libboost_filesystem-vc140-mt-gd-1_61.lib
Boost_FILESYSTEM_LIBRARY_RELEASE: D:\lib\Boost\lib\libboost_filesystem-vc140-mt-1_61.lib
Boost_INCLUDE_DIR: D:\lib\Boost\include\boost-1_61
Boost_IOSTREAMS_LIBRARY_DEBUG: D:\lib\Boost\lib\libboost_iostreams-vc140-mt-gd-1_61.lib
Boost_IOSTREAMS_LIBRARY_RELEASE: D:\lib\Boost\lib\libboost_iostreams-vc140-mt-1_61.lib
Boost_LIBRARY_DIR_DEBUG: D:\lib\Boost\lib
Boost_LIBRARY_DIR_RELEASE: D:\lib\Boost\lib
Boost_MPI_LIBRARY_DEBUG: D:\lib\Boost\lib\libboost_mpi-vc140-mt-gd-1_61.lib
Boost_MPI_LIBRARY_RELEASE: D:\lib\Boost\lib\libboost_mpi-vc140-mt-1_61.lib
Boost_SERIALIZATION_LIBRARY_DEBUG: D:\lib\Boost\lib\libboost_serialization-vc140-mt-gd-1_61.lib
Boost_SERIALIZATION_LIBRARY_RELEASE: D:\lib\Boost\lib\libboost_serialization-vc140-mt-1_61.lib
Boost_SYSTEM_LIBRARY_DEBUG: D:\lib\Boost\lib\libboost_system-vc140-mt-gd-1_61.lib
Boost_SYSTEM_LIBRARY_RELEASE: D:\lib\Boost\lib\libboost_system-vc140-mt-1_61.lib
Boost_THREAD_LIBRARY_DEBUG: D:\lib\Boost\lib\libboost_thread-vc140-mt-gd-1_61.lib
Boost_THREAD_LIBRARY_RELEASE: D:\lib\Boost\lib\libboost_thread-vc140-mt-1_61.lib
CMAKE
CMAKE_CONFIGURATION_TYPES: Debug;Release
CMAKE_INSTALL_PREFIX: D:\lib\PCL
FLANN
FLANN_INCLUDE_DIR: D:\lib\flann\include
FLANN_LIBRARY: D:\lib\flann\lib\flann_cpp_s.lib
FLANN_LIBRARY_DEBUG: D:\lib\flann\lib\flann_cpp_s-gd.lib
OPENNI2
OPENNI2_INCLUDE_DIRS: C:\Program Files\OpenNI2\Include
OPENNI2_LIBRARY: C:\Program Files\OpenNI2\Lib\OpenNI2
QHULL
QHULL_INCLUDE_DIR: D:\lib\qhull\include
QHULL_LIBRARY: D:\lib\qhull\lib\qhullstatic.lib
QHULL_LIBRARY_DEBUG: D:\lib\qhull\lib\qhullstatic_d.lib
WITH
WITH_CUDA: ☐(uncheck)
WITH_DAVIDSDK: ☐(uncheck)
WITH_DOCS: ☐(uncheck)
WITH_DSSDK: ☐(uncheck)
WITH_ENSENSO: ☐(uncheck)
WITH_FZAPI: ☐(uncheck)
WITH_LIBUSB: ☐(uncheck)
WITH_OPENGL: ☑(check)
WITH_OPENNI: ☐(uncheck)
WITH_OPENNI2: ☑(check)
WITH_PCAP: ☐(uncheck)
WITH_PNG: ☐(uncheck)
WITH_QHULL: ☑(check)
WITH_QT: ☐(uncheck)
WITH_RSSDK: ☐(uncheck)
WITH_VTK: ☑(check)
然后再次 Configure 無誤后使用 Generate 生成 VS 解決方案。
若在第二次Configure時出現在pcl-pcl-1.8.0中OpenNI文件參數不匹配,從官網下載正確的版本替換即可。
筆者這里替換D:\lib\pcl-pcl-1.8.0\build中的OpenNI-Windows-x86-2.2.0.33.zip
然后再次Configure,沒有問題后Generate。
使用管理員權限啟動 Visual Studio,通過 File | Open | Project/Solution 菜單打開 D:\lib\PCL-1.8.0\build\PCL.sln 解決方案。
在 Debug 模式下,從 Solution Explorer 中選定 ALL_BUILD,右鍵選擇 Build 構建源代碼,構建完成后選定 INSTALL,再右鍵選擇 Build 將構建生成的文件安裝到指定位置。
切換為 Release 模式,在 Solution Explorer 中選定 ALL_BUILD,右鍵選擇 Build 構建源代碼,構建完成后選定 INSTALL,再右鍵選擇 Build 將構建生成的文件安裝到指定位置。
這樣將生成 Release 版本和 Debug 版本的庫文件和動態鏈接庫。
編譯成功后添加用戶變量 PCL_ROOT 為 D:\lib\PCL,並在變量 Path 中添加 %PCL_ROOT%\bin 和 %OPENNI2_REDIST64%。
即Path:
D:\lib\PCL\bin
D:\Program Files (x86)\OpenNI2\Tools(這里在安裝OpenNI2的時候已經存在,可以無需添加)
注意到選定了 BUILD_all_in_one_installer 選項,構建的時候會把用到的第三方庫編譯好的文件拷貝到 D:\lib\PCL\3rdParty 目錄中,因此整個過程編譯完成后僅需要保留 D:\lib\PCL 目錄就可以了。
(這里做一個簡單說明,下面添加的修改的用戶變量,可以不進行更改,這要取決於你之后使用PCL庫時怎樣去配置,筆者在閱覽了大量有關PCL編譯和配置相關博文后,簡單總結一下實際PCL庫配置所需的更改,即添加一個PCL_ROOT環境變量,在OpenNI2安裝正確的情況下,只需要在Path路徑下添加以下五個第三方庫的bin目錄即可,筆者這里主要是分享PCL庫的編譯過程,配置問題在這里暫時不具體討論,網上對於PCL庫配置的博文很多,大同小異,筆者這里建議在編譯第三方庫和PCL庫的過程中,參考PCL庫解決方案的庫配置能夠學到很多有關其配置的信息)。
但是要注意修改一些之前設置的用戶變量,包括:
BOOST_ROOT: D:\lib\PCL\3rdParty\Boost
EIGEN_ROOT: D:\lib\PCL\3rdParty\Eigen
FLANN_ROOT: D:\lib\PCL\3rdParty\FLANN
QHULL_ROOT: D:\lib\PCL\3rdParty\Qhull
VTK_DIR: D:\lib\PCL\3rdParty\VTK
編譯完成后最好重啟系統或注銷用戶賬戶重新登錄,以使這些用戶變量和環境變量生效。
筆者在進行了多次PCL庫編譯后總結出的一些經驗分享給大家,希望使用PCL庫的朋友們能夠多多分享經驗,PCL庫是一個開源庫,其中也存在很多BUG,在大家使用過程中肯定會遇到很多問題,希望大家多分享優秀的博文供大家討論參考。筆者接觸PCL庫不久,若以上內容有問題,希望大家提出並指正!