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