CMake+VS2013编译与安装32/64位PCL1.8RC1源码(附网盘链接)

来源:互联网 发布:weka数据挖掘实验报告 编辑:程序博客网 时间:2024/05/17 02:39

CMake+VS2013编译与安装32/64位PCL1.8RC1源码(附网盘链接)

  • 大家好,这是我的第一篇CSDN微博,我的博客旨在在记录本人的学习历程,也希望对大家有所助益!

PCL(点云库)的安装方式有两种,即从源码直接编译和下载与系统环境对应的All-in-One Installer安装程序,当系统当前的安装环境不满足安装程序的要求或希望采用特定版本的组件包进行开发时,可以选择自己编译PCL这种更灵活的方式。需要说明的是本文虽然列出了32/64位的编译安装方法,但我仅编译了64位代码所需的库和头文件,据说32位的更容易编译(64位系统下也能编译出32位库)所以没有尝试。我的编译环境如下:

  • Windows 10 64位
  • Visual Studio 2013 旗舰版 64位编译器
  • CUDA7.5 64位
  • CMake 版本 3.5.0 RC2
  • MS-MPI 版本 v7
  • Eigen 版本 3.2.8
  • Boost 版本 1.60
  • VTK 版本 7.0
  • QT 版本 5.5.1
  • PCL 版本 1.8RC1
  • FFTW 版本3.3.4
  • Qhull 版本 2015.2
  • OpenNI 版本 2.2.0.33 beta
  • Microsoft Kinect SDK 版本 2.0

列出的基本组件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\Boostbootstrap.bat

32位系统输入:

cd D:\PCL\dep\Boostbootstrap.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安装包可以直接使用,无需再配置环境变量,只需在测试代码中添加包含库和链接库即可(如果下载了编译包在使用前必须重新设定环境变量的值)。

2 0
原创粉丝点击