PCL1.8.0點雲庫的編譯過程詳解


本文在參考一下兩篇博文后,自行編譯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編譯32PCL

若配置環境不同,應稍作更改,不過基本上步驟相同。

 

一、准備工作

首先確保安裝了以下工具:

Visual Studio Enterprise 2015(Update3,其他版本應該也同樣可以)

CMake3.7.2(cmake-3.7.2-win64-x64.msi,理論上>=3.6.0版本即可)

https://cmake.org/download/

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庫不久,若以上內容有問題,希望大家提出並指正!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM