CMake+VS2013編譯與安裝32/64位PCL1.8RC1源碼(附網盤鏈接)

CMake+VS2013編譯與安裝32/64位PCL1.8RC1源碼(附網盤鏈接)

  • 大家好,這是我的第一篇CSDN微博,我的博客旨在在記錄本人的學習歷程,也希望對大家有所助益!

PCL(點雲庫)的安裝方式有兩種,即從源碼直接編譯和下載與系統環境對應的All-in-One Installer安裝程序,當系統當前的安裝環境不滿足安裝程序的要求或希望採用特定版本的組件包進行開發時,可以選擇自己編譯PCL這種更靈活的方式。需要說明的是本文雖然列出了32/64位的編譯安裝方法,但我僅編譯了64位代碼所需的庫和頭文件,據說32位的更容易編譯(64位系統下也能編譯出32位庫)所以沒有嘗試。我的編譯環境如下:

列出的基本組件Boost、Eigen、VTK、Qhull爲PCL要求必須具備的;QT和VTK可以編譯成QVTK;FFTW庫能夠與Eigen庫結合,用於快速傅里葉變換;OpenNI包含深度相機所需的驅動和庫函數(如果想開發Kinect 1代相機應用,還需要中間件NITE),2.2版本表現更加優秀;CUDA是以前和OpenCV一起安裝的,在PCL的編譯中只起測試作用;MS-MPI是Microsoft MPI工具,用於編譯Boost;除了Eigen和VS,其他組件版本均爲截止到目前的最新版本。PCL編譯過程主要參考了一個日本同行的博客,他編譯了32位和64位的PCL1.8+VS2015的All-in-One Installer並附有詳細過程,我已經將兩個Installer搬運過來方便上不了Github和OneDrive的朋友們下載,網盤還有本文編譯出的庫文件和頭文件:密碼:abx7


安裝Boost

  • . 安裝Microsoft MPI

MS-MPI 2012R2版本可以編譯Boost 1.59,但是無法編譯Boost 1.60,所以要採用MS-MPI v7,MPI v7版本與舊版不同,分爲SDK(庫文件和頭文件,本文安裝在C:\Program Files\Microsoft SDK目錄)和MPI(可執行程序,本文安裝在C:\Program Files (x86)\Microsoft MPI目錄)兩個必須安裝的組件,本文中所有的組件安裝根目錄都可以改變,但在環境變量、命令行、代碼部分涉及安裝根目錄時一定要正確地用自己的安裝目錄替換本文的示例目錄。如果卸載舊版MPI再安裝新版MPI可能會出現“MS-MPI Installation failed with error code 2”的問題,這是由於MPI軟件缺陷導致卸載時無法清除其註冊表信息,解決方法是手動刪除註冊表裏的

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall{8499ACD3-C1E3-45AB-BF96-DA491727EBE1}文件夾

  • 編譯源碼

本文中Boost 1.60的解壓根目錄爲D:\PCL\dep\Boost,首先在系統環境變量中添加系統變量:

名稱:BOOST_ROOT
路徑:D:\PCL\dep\Boost

修改D:\PCL\dep\Boost\tools\build\src\tools\mpi.jam文件並保存:

249-251 行:

local microsoft_mpi_sdk_path = "C:\\Program Files (x86)\\Microsoft MPI" ;
local microsoft_mpi_path = "C:\\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"\" ;

管理員權限打開VS2013開發人員命令提示工具,64位系統輸入:

cd /d D:\PCL\dep\Boost
bootstrap.bat

32位系統輸入:

cd D:\PCL\dep\Boost
bootstrap.bat

先不要關閉命令提示符窗口(關了則必須在之後的命令行輸入步驟中用cd命令重新定位到根目錄D:\PCL\dep\Boost),如果成功,在根目錄下會生成b2.exe和project-config.jam文件,修改project-config.jam文件並保存:

在第 4 行輸入:using mpi ; 

在VS2013開發人員命令提示工具中,32位系統輸入:

b2.exe toolset=msvc-12.0 address-model=32 --build-dir=build\x86 install --prefix="D:\PCL\dep\Boost" -j8

64位系統輸入:

b2.exe toolset=msvc-12.0 address-model=64 --build-dir=build\x64 install --prefix="D:\PCL\dep\Boost" -j8

如果採用Visual Studio 2015 編譯器,則需要將上述命令行中的msvc-12.0更改爲msvc-14.0,我的機器等待了大概10分鐘(由電腦性能決定),完成後只出現了2個錯誤。檢查產生的D:\PCL\dep\Boost\lib文件夾中是否含有:

libboost_mpi-vc120-mt-gd-1_60.lib 和 libboost_mpi-vc120-mt-1_60.lib
libboost_thread-vc120-mt-gd-1_60.lib 和 libboost_thread-vc120-mt-1_60.lib

如果出現了這幾個lib文件,編譯可以認爲是成功的。只保留根目錄下的include和lib文件夾,如不需再次編譯,可以直接刪除根目錄下其餘文件。


編譯Eigen

本文中Eigen的解壓根目錄爲D:\PCL\dep\Eigen。Eigen目前最新版本爲3.3 beta (3.2.92),VS編譯通過但是在PCL的編譯中會出現Eigen類中某個數據類型不匹配導致出錯,所以採用最新的穩定版本 3.2.8。首先在系統環境變量中添加系統變量:

名稱:EIGEN_ROOT
路徑:D:\PCL\dep\Eigen

如果需要FFTW,64位編譯好的FFTW庫已經附在網盤文件dep/Eigen目錄下,32位的需要自己手動編譯,這裏給出編譯方法,假設已經解壓FFTW源碼到D:\PCL\dep\Eigen\FFTW根目錄下:

32位——管理員運行VS2013開發人員命令提示工具,依次輸入以下命令,如果出現無法識別lib命令的錯誤說明用的是Windows的cmd.exe,或是VS沒有安裝好。

cd D:\PCL\dep\Eigen\FFTW
lib /def:libfftw3-3.def
lib /def:libfftw3f-3.def
lib /def:libfftw3l-3.def

64位——管理員運行VS2013開發人員命令提示工具,依次輸入以下命令

cd /d D:\PCL\dep\Eigen\FFTW
lib /machine:x64 /def:libfftw3-3.def
lib /machine:x64 /def:libfftw3f-3.def
lib /machine:x64 /def:libfftw3l-3.def

如果編譯成功,在根目錄下會出現libfftw3-3.lib和libfftw3-3.exp等6個文件,新建include文件夾和lib文件夾,將根目錄下的個6個.lib文件和.exp文件移動到lib文件夾,將fftw3.h移動到include文件夾。如果不需要FFTW則跳過以上幾個步驟。

接下來運行CMake,如下圖設置source code 和 binaries路徑(binaries路徑爲D:/PCL/dep/Eigen/build,source code路徑爲D:/PCL/dep/Eigen),設置好後會提示新建文件夾,點確定。之後點擊Configure,注意一定要選擇對應VS編譯器版本的generator,否則會出錯。

這裏寫圖片描述

如果之前配置了FFTW,採用默認配置,這裏只需要手動輸入條目:

Ungrouped Entries/FFTWL_LIB=D:/PCL/dep/Eigen/FFTW/lib/libfftw3l-3.lib
Ungrouped Entries/FFTWF_LIB=D:/PCL/dep/Eigen/FFTW/lib/libfftw3f-3.lib
FFTW/FFTW_INCLUDES=D:/PCL/dep/Eigen/FFTW/include
FFTW/FFTW_LIB=D:/PCL/dep/Eigen/FFTW/lib/libfftw3-3.lib

這裏寫圖片描述

如果沒有配置FFTW,忽略上面的條目則。繼續修改:

CMAKE/CMAKE_INSTALL_PREFIX=D:/PCL/dep/Eigen
CMAKE/CMAKE_CONFIGURATION_TYPES=Debug;Release

如果不修改這一條會導致安裝混亂,不方便管理安裝文件。最後點擊Configure,修正直到紅色選項消失,點擊Generate,打開D:/PCL/dep/Eigen下的Eigen.sln,等待預加載完成後編譯平臺根據需要設置爲x64或者Win32,模式爲Debug和Release下分別先重新生成ALL BUILD再重新生成INSTALL,如果沒有錯誤表示編譯成功;如編譯了FFTW,可以刪除include和lib文件夾以外的其他文件;如不需要再次編譯,可以刪除Eigen根目錄下除了include文件夾以外的其他文件。


安裝Flann

本文中Flann的解壓根目錄爲D:\PCL\dep\Flann。首先在系統環境變量中添加系統變量:

名稱:FLANN_ROOT
路徑:D:\PCL\dep\Flann

修改D:\PCL\dep\Flann\cpp\flann\util\serialization.h文件,在第92行空白處添加代碼:

#ifdef _MSC_VER
    BASIC_TYPE_SERIALIZER( unsigned __int64 );
#endif

運行CMake,設置source code 和 binaries路徑(binaries 路徑爲D:/PCL/dep/Flann/build,source code 路徑爲D:/PCL/dep/Flann),點擊Configure後選擇對應版本的編譯器。點擊界面上的Add Entry按鈕,新建:

Name=CMAKE_DEBUG_POSTFIX,Type=STRING,Value=-gd

該CMake選項用於修改編譯生成的Debug庫的後綴名。接着修改:

CMAKE/CMAKE_INSTALL_PREFIX=D:/PCL/dep/Flann
CMAKE/CMAKE_CONFIGURATION_TYPES=Debug;Release

在BUILD菜單中的4個選項中只勾選BUILD_C_BINDINGS,點擊Configure,無紅色條目後點擊Generate。打開D:/PCL/dep/Flann/build目錄下的flann.sln,等待預加載完成後編譯平臺根據需要設置爲x64或者Win32,模式爲Debug和Release下分別先重新生成ALL BUILD再重新生成INSTALL,如果沒有錯誤表示編譯成功;如不需要再次編譯,可以刪除Flann根目錄下除了include、bin、lib、share文件夾以外的其他文件。


安裝Qhull

本文中Qhull的解壓根目錄爲D:\PCL\dep\Qhull。首先在系統環境變量中添加系統變量:

名稱:QHULL_ROOT
路徑:D:\PCL\dep\Qhull

運行CMake,設置source code 和 binaries路徑(binaries 路徑爲D:/PCL/dep/Qhull/build,source code 路徑爲D:/PCL/dep/Qhull),點擊Configure後選擇對應版本的編譯器。點擊界面上的Add Entry按鈕,新建:

Name=CMAKE_DEBUG_POSTFIX,Type=STRING,Value=_d

該CMake選項用於修改編譯生成的Debug庫的後綴名。接着修改:

CMAKE/CMAKE_INSTALL_PREFIX=D:/PCL/dep/Qhull
CMAKE/CMAKE_CONFIGURATION_TYPES=Debug;Release

點擊Configure,無紅色條目後點擊Generate。打開D:/PCL/dep/Qhull/build目錄下的qhull.sln,等待預加載完成後編譯平臺根據需要設置爲x64或者Win32,模式爲Debug和Release下分別先重新生成ALL BUILD再重新生成INSTALL,如果沒有錯誤表示編譯成功;如不需要再次編譯,可以刪除Qhull根目錄下除了include、bin、lib、man、doc文件夾以外的其他文件。


安裝VTK(可選QVTK)

  • 安裝VTK

本文中VTK源碼的解壓根目錄爲D:\PCL\dep\VTK,如果源碼是在官網下載的還要在官網下載VTKData-7.0.0.zip文件,並將解壓出來的.ExternalData文件夾放到D:\PCL\dep\VTK下。首先在系統環境變量中添加系統變量:

名稱:VTK_DIR
路徑:D:\PCL\dep\VTK

在系統環境變量Path末尾添加(非Win10系統注意要在路徑開頭加分隔符 ; )%VTK_DIR%\bin,完成後重啓電腦使環境變量生效。運行CMake,設置source code 和 binaries路徑(binaries 路徑爲D:/PCL/dep/VTK/build,source code 路徑爲D:/PCL/dep/VTK),點擊Configure後選擇對應版本的編譯器。點擊界面上的Add Entry按鈕,新建:

Name=CMAKE_DEBUG_POSTFIX,Type=STRING,Value=-gd

該CMake選項用於修改編譯生成的Debug庫的後綴名。接着修改:

CMAKE/CMAKE_INSTALL_PREFIX=D:/PCL/dep/VTK
CMAKE/CMAKE_CONFIGURATION_TYPES=Debug;Release
CMAKE菜單下,勾選CMAKE_CXX_MP_FLAG
BUILD菜單下,必須勾選BUILD_SHARED_LIBS,可選BUILD_EXAMPLES,不勾選另外3個。
VTK/VTK_RENDERING_BACKEND=OpenGL
VTK/VTK_DATA_STORE=D:/PCL/dep/VTK/.ExternalData

其他保持默認即可,我額外勾選了Module/Module_vtkglew生成了vtkglew.h文件;由於PCL1.8版本尚不支持OpenGL2,所以需要將VTK默認的OpenGL2設置更改成OpenGL,這樣才能順利生成vtkgl.h文件;如果沒有opengl32.dll等OpenGL必備組件,則需自行配置,本文假設環境已經搭建完善。

點擊Configure,無紅色條目後點擊Generate。打開D:/PCL/dep/Qhull/build目錄下的qhull.sln,等待預加載完成後編譯平臺根據需要設置爲x64或者Win32,模式爲Debug和Release下分別先重新生成ALL BUILD再重新生成INSTALL,如果沒有錯誤表示編譯成功。

  • (可選)安裝QVTK

QVTK即VTK+QT,目前VTK7.0已經完美支持QT5,要求電腦中事先安裝好QT5,並保證已經建立了系統環境變量QT_DIR且已經生效,本文的環境變量值爲:D:\Qt5\5.5\msvc2013_64。這裏爲了保證獨立性給出了QVTK完整安裝的版本,如果安裝過上述VTK,可以參考這一部分直接用CMake重新編譯(前提是沒有刪除其他文件)。

本文中VTK源碼的解壓根目錄爲D:\PCL\dep\VTK,如果源碼是在官網下載的還要在官網下載VTKData-7.0.0.zip文件,並將解壓出來的.ExternalData文件夾放到D:\PCL\dep\VTK下。首先在系統環境變量中添加系統變量:

名稱:VTK_DIR
路徑:D:\PCL\dep\VTK

在系統環境變量Path末尾添加(非Win10系統注意要在路徑開頭加分隔符 ; )%VTK_DIR%\bin,完成後重啓電腦使環境變量生效。運行CMake,設置source code 和 binaries路徑(binaries 路徑爲D:/PCL/dep/VTK/build,source code 路徑爲D:/PCL/dep/VTK),點擊Configure後選擇對應版本的編譯器。點擊界面上的Add Entry按鈕,新建:

Name=CMAKE_DEBUG_POSTFIX,Type=STRING,Value=-gd

該CMake選項用於修改編譯生成的Debug庫的後綴名。接着修改:

CMAKE/CMAKE_INSTALL_PREFIX=D:/PCL/dep/VTK
CMAKE/CMAKE_CONFIGURATION_TYPES=Debug;Release
CMAKE菜單下,另外勾選CMAKE_CXX_MP_FLAG
BUILD菜單下,必須勾選BUILD_SHARED_LIBS,可選BUILD_EXAMPLES,不勾選另外3個。
VTK/VTK_RENDERING_BACKEND=OpenGL
VTK菜單下,另外勾選VTK_Group_Qt
VTK/VTK_DATA_STORE=D:/PCL/dep/VTK/.ExternalData

此外,我還勾選了Module/Module_vtkglew以生成vtkglew.h文件,點擊Configure,會提示CMake錯誤,不用理會,在開頭的3個紅色條目中,保證DirectX目錄正確,並修改:

VTK/VTK_QT_VERSION=5

之後連續點擊Configure,直到紅色條目全部消失,其他保持默認,最後點擊Generate。打開D:/PCL/dep/VTK/build目錄下的VTK.sln,等待預加載完成後編譯平臺根據需要設置爲x64或者Win32,模式爲Debug下重新生成ALL BUILD,全部成功後找到D:\PCL\dep\VTK\build\bin\Debug路徑下的QVTKWidgetPlugin-gd.dll 文件,複製一份放在相同目錄下,將其名字改爲QVTKWidgetPlugin.dll,然後在VTK.sln中重新生成INSTALL,生成成功後刪除複製出來的QVTKWidgetPlugin.dll。切換到Release模式,重新生成ALL BUILD,再重新生成INSTALL。如果沒有錯誤表示編譯成功;如不需要再次編譯,可以刪除VTK根目錄下除了include、bin、lib、share、CMake文件夾以外的其他文件。


安裝PCL

如果沒有安裝OpenNI,則先安裝OpenNI。當上述組件全部配置完成後,最後一步是編譯PCL。本文中PCL源碼的解壓根目錄爲D:\PCL,首先在系統環境變量中添加系統變量:

名稱:PCL_ROOT
路徑:D:\PCL

系統環境變量Path末尾添加(非Win10系統注意要在路徑開頭加分隔符 ; ,由於%VTK_DIR%\bin已經添加過,這裏不再列出,如果沒有添加,一定要記得加上):

%PCL_ROOT%\bin
%OPENNI2_REDIST64%
%FLANN_ROOT%\Bin
%QHULL_ROOT%\Bin

重啓電腦使環境變量生效,運行CMake,設置source code 和 binaries路徑(binaries 路徑爲D:/PCL/build,source code 路徑爲D:/PCL),點擊Configure後選擇對應版本的編譯器,修改條目:

CMAKE/CMAKE_INSTALL_PREFIX=D:/PCL

然後按照下圖編輯CMake選項:

這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述

下面對某些選項做出說明:

  • 大部分選項都由設定的環境變量自動生成,如果沒有重啓電腦導致環境變量沒有生效,則需要手動輸入。
  • BUILD菜單裏,如果勾上BUILD_CUDA及其相應的組件則在CMake中不會出錯,但NVCC編譯器無法編譯CMake文件,猜測可能是PCL1.8不支持CUDA7.5,歡迎讀者選用CUDA6.5來驗證。
  • BUILD菜單裏,如果勾上BUILD_GPU,則與GPU相關的編譯在CUDA7.5下均無法成功,無法編譯測試Kinfu代碼。
  • BUILD_apps選項需要OpenNI1.x的支持,筆者機器裏沒有安裝OpenNI1.x使得3個app組件無法編譯,經過查閱資料得知,也有可能是安裝了Kinect SDK使得OpenNI的部分驅動被屏蔽。
  • BUILD_example選項是可選項,筆者編譯了該選項,發現有三個example組件編譯通不過,查閱資料後發現該3個錯誤同樣在其他同行PCL1.8的example組件編譯中存在,可以通過修改源碼或者修改包含庫的方式糾正。由於這幾個錯誤並不影響使用,所以並沒有在此詳細敘述。
  • WITH下的WITH_QT選項如果安裝了QVTK則一定要勾選,否則QT將無法在PCL中使用。本文提供的QVTK編譯包包含了PCL對QT5的前端支持。
  • GLUT和GLEW兩項只能有一個是正確配置的,例如在上圖中指定GLUT的路徑,會造成CMake編譯出錯,故在編譯中僅僅保留了GLEW的兩個包含路徑。

CMake的編譯情況見下圖:

這裏寫圖片描述

打開D:/PCL/build目錄下的PCL.sln,等待預加載完成後編譯平臺根據需要設置爲x64或者Win32,模式爲Debug和Release下分別先重新生成ALL BUILD再重新生成INSTALL,如果沒有錯誤表示編譯成功;如不需要再次編譯,可以刪除PCL根目錄下除了include、bin、lib、cmake、dep文件夾以外的其他文件。最終的PCL安裝包可以直接使用,無需再配置環境變量,只需在測試代碼中添加包含庫和鏈接庫即可(如果下載了編譯包在使用前必須重新設定環境變量的值)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章