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
用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
64: $(microsoft_mpi_sdk_path)/Lib/x64
$(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的解压根目录为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的解压根目录为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的解压根目录为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源码的解压根目录为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即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文件夹以外的其他文件。
如果没有安装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选项:
下面对某些选项做出说明:
CMake的编译情况见下图:
打开D:/PCL/build目录下的PCL.sln,等待预加载完成后编译平台根据需要设置为x64或者Win32,模式为Debug和Release下分别先重新生成ALL BUILD再重新生成INSTALL,如果没有错误表示编译成功;如不需要再次编译,可以删除PCL根目录下除了include、bin、lib、cmake、dep文件夹以外的其他文件。最终的PCL安装包可以直接使用,无需再配置环境变量,只需在测试代码中添加包含库和链接库即可(如果下载了编译包在使用前必须重新设定环境变量的值)。