本文在参考一下两篇博文后,自行编译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库不久,若以上内容有问题,希望大家提出并指正!
