文章目录
0. 简要说明
需求:分别在Windows和Linux(ubuntu)环境下,安装PCL,编译运行PCL程序。
目前测试可实现的环境:Windows,Ubuntu18,20(Ubuntu22的版本对不上,嫌麻烦)
1.Windows环境下
一般都是通过VS的方式。
准备工具:
1.1 安装
以vs2019,安装PCL-1.11.1-ALLInOne-msvc-2019-win64.exe为例
- 将其安装到目录
C:/Program Files
下
- 安装他的依赖库。(注意,在过程中可能会弹出路径长度不够的提示,不用管他,直接OK或者关掉,自动会把OpenNI2放PCL的同级)
安装的组件位置会是如下:
C:\Program Files\PCL 1.11.1 # PCL自身的库
C:\Program Files\OpenNI2 # PCL依赖的OpenNI2库
C:\Program Files\PCL 1.11.1\3rdParty # PCL依赖的其他库
- 配置环境变量
修改 系统属性->环境变量->系统属性。如下图,可以看到 OPENNI2和PCL的变量已经设置好,现在需要修改Path
的值
将如下运行时库的路径加入Path
C:\Program Files\PCL 1.11.1\bin
C:\Program Files\PCL 1.11.1\3rdParty\VTK\bin
C:\Program Files\OpenNI2\Redist
1.2 VS工程配置
1.2.1 vs2019+PCL
在完成PCL的安装后,配置VS工程。
右击选择某个VS工程->属性进行修改。
前提:
- 设置和编译时一定要注意编译器是否为X64,也要注意区分DEBUG/RELEASE
- 配置属性->常规:注意平台工具集,C++语言标准,是否正确
- C/C++ -> 常规->附加包含目录:是否为源文件的头文件路径(以源文件为对象的相对路径)
- C/C++ ->所有选项->SDL检查:PCL工程的话,尽量还是把这个关闭
- VC++目录->包含目录:设置
PCL
库的头文件路径如下
C:\Program Files\PCL 1.11.1\include\pcl-1.11
C:\Program Files\PCL 1.11.1\3rdParty\Boost\include\boost-1_74
C:\Program Files\PCL 1.11.1\3rdParty\Eigen\eigen3
C:\Program Files\PCL 1.11.1\3rdParty\FLANN\include
C:\Program Files\PCL 1.11.1\3rdParty\Qhull\include
C:\Program Files\PCL 1.11.1\3rdParty\VTK\include\vtk-8.2
C:\Program Files\OpenNI2\Include
- VC++目录->库目录:设置
PCL
库的库文件路径。
C:\Program Files\PCL 1.11.1\lib
C:\Program Files\PCL 1.11.1\3rdParty\Boost\lib
C:\Program Files\PCL 1.11.1\3rdParty\FLANN\lib
C:\Program Files\PCL 1.11.1\3rdParty\Qhull\lib
C:\Program Files\PCL 1.11.1\3rdParty\VTK\lib
C:\Program Files\OpenNI2\Lib
- 链接器->输入->附加依赖库:设置
PCL
及它依赖的库,包括PCL
和vtk
两部分。注意:两者都分为debug
/release
版本,添加时一定要注意区分。如下是debug
版本。这里的步骤以debug
版本举例
PCL
的库文件如下:
pcl_commond.lib
pcl_featuresd.lib
pcl_filtersd.lib
pcl_iod.lib
pcl_io_plyd.lib
pcl_kdtreed.lib
pcl_keypointsd.lib
pcl_mld.lib
pcl_octreed.lib
pcl_outofcored.lib
pcl_peopled.lib
pcl_recognitiond.lib
pcl_registrationd.lib
pcl_sample_consensusd.lib
pcl_searchd.lib
pcl_segmentationd.lib
pcl_stereod.lib
pcl_surfaced.lib
pcl_trackingd.lib
pcl_visualizationd.lib
vtk
库:如下是debug
版本。
vtkChartsCore-8.2-gd.lib
vtkCommonColor-8.2-gd.lib
vtkCommonComputationalGeometry-8.2-gd.lib
vtkCommonCore-8.2-gd.lib
vtkCommonDataModel-8.2-gd.lib
vtkCommonExecutionModel-8.2-gd.lib
vtkCommonMath-8.2-gd.lib
vtkCommonMisc-8.2-gd.lib
vtkCommonSystem-8.2-gd.lib
vtkCommonTransforms-8.2-gd.lib
vtkDICOMParser-8.2-gd.lib
vtkDomainsChemistry-8.2-gd.lib
vtkDomainsChemistryOpenGL2-8.2-gd.lib
vtkdoubleconversion-8.2-gd.lib
vtkexodusII-8.2-gd.lib
vtkexpat-8.2-gd.lib
vtkFiltersAMR-8.2-gd.lib
vtkFiltersCore-8.2-gd.lib
vtkFiltersExtraction-8.2-gd.lib
vtkFiltersFlowPaths-8.2-gd.lib
vtkFiltersGeneral-8.2-gd.lib
vtkFiltersGeneric-8.2-gd.lib
vtkFiltersGeometry-8.2-gd.lib
vtkFiltersHybrid-8.2-gd.lib
vtkFiltersHyperTree-8.2-gd.lib
vtkFiltersImaging-8.2-gd.lib
vtkFiltersModeling-8.2-gd.lib
vtkFiltersParallel-8.2-gd.lib
vtkFiltersParallelImaging-8.2-gd.lib
vtkFiltersPoints-8.2-gd.lib
vtkFiltersProgrammable-8.2-gd.lib
vtkFiltersSelection-8.2-gd.lib
vtkFiltersSMP-8.2-gd.lib
vtkFiltersSources-8.2-gd.lib
vtkFiltersStatistics-8.2-gd.lib
vtkFiltersTexture-8.2-gd.lib
vtkFiltersTopology-8.2-gd.lib
vtkFiltersVerdict-8.2-gd.lib
vtkfreetype-8.2-gd.lib
vtkGeovisCore-8.2-gd.lib
vtkgl2ps-8.2-gd.lib
vtkglew-8.2-gd.lib
vtkGUISupportMFC-8.2-gd.lib
vtkhdf5-8.2-gd.lib
vtkhdf5_hl-8.2-gd.lib
vtkImagingColor-8.2-gd.lib
vtkImagingCore-8.2-gd.lib
vtkImagingFourier-8.2-gd.lib
vtkImagingGeneral-8.2-gd.lib
vtkImagingHybrid-8.2-gd.lib
vtkImagingMath-8.2-gd.lib
vtkImagingMorphological-8.2-gd.lib
vtkImagingSources-8.2-gd.lib
vtkImagingStatistics-8.2-gd.lib
vtkImagingStencil-8.2-gd.lib
vtkInfovisCore-8.2-gd.lib
vtkInfovisLayout-8.2-gd.lib
vtkInteractionImage-8.2-gd.lib
vtkInteractionStyle-8.2-gd.lib
vtkInteractionWidgets-8.2-gd.lib
vtkIOAMR-8.2-gd.lib
vtkIOAsynchronous-8.2-gd.lib
vtkIOCityGML-8.2-gd.lib
vtkIOCore-8.2-gd.lib
vtkIOEnSight-8.2-gd.lib
vtkIOExodus-8.2-gd.lib
vtkIOExport-8.2-gd.lib
vtkIOExportOpenGL2-8.2-gd.lib
vtkIOExportPDF-8.2-gd.lib
vtkIOGeometry-8.2-gd.lib
vtkIOImage-8.2-gd.lib
vtkIOImport-8.2-gd.lib
vtkIOInfovis-8.2-gd.lib
vtkIOLegacy-8.2-gd.lib
vtkIOLSDyna-8.2-gd.lib
vtkIOMINC-8.2-gd.lib
vtkIOMovie-8.2-gd.lib
vtkIONetCDF-8.2-gd.lib
vtkIOParallel-8.2-gd.lib
vtkIOParallelXML-8.2-gd.lib
vtkIOPLY-8.2-gd.lib
vtkIOSegY-8.2-gd.lib
vtkIOSQL-8.2-gd.lib
vtkIOTecplotTable-8.2-gd.lib
vtkIOVeraOut-8.2-gd.lib
vtkIOVideo-8.2-gd.lib
vtkIOXML-8.2-gd.lib
vtkIOXMLParser-8.2-gd.lib
vtkjpeg-8.2-gd.lib
vtkjsoncpp-8.2-gd.lib
vtklibharu-8.2-gd.lib
vtklibxml2-8.2-gd.lib
vtklz4-8.2-gd.lib
vtklzma-8.2-gd.lib
vtkmetaio-8.2-gd.lib
vtkNetCDF-8.2-gd.lib
vtkogg-8.2-gd.lib
vtkParallelCore-8.2-gd.lib
vtkpng-8.2-gd.lib
vtkproj-8.2-gd.lib
vtkpugixml-8.2-gd.lib
vtkRenderingAnnotation-8.2-gd.lib
vtkRenderingContext2D-8.2-gd.lib
vtkRenderingContextOpenGL2-8.2-gd.lib
vtkRenderingCore-8.2-gd.lib
vtkRenderingExternal-8.2-gd.lib
vtkRenderingFreeType-8.2-gd.lib
vtkRenderingGL2PSOpenGL2-8.2-gd.lib
vtkRenderingImage-8.2-gd.lib
vtkRenderingLabel-8.2-gd.lib
vtkRenderingLOD-8.2-gd.lib
vtkRenderingOpenGL2-8.2-gd.lib
vtkRenderingVolume-8.2-gd.lib
vtkRenderingVolumeOpenGL2-8.2-gd.lib
vtksqlite-8.2-gd.lib
vtksys-8.2-gd.lib
vtktheora-8.2-gd.lib
vtktiff-8.2-gd.lib
vtkverdict-8.2-gd.lib
vtkViewsContext2D-8.2-gd.lib
vtkViewsCore-8.2-gd.lib
vtkViewsInfovis-8.2-gd.lib
vtkzlib-8.2-gd.lib
- C/C++ -> 预处理->预处理器定义:设置如下编译选项,避免不必要的编译错误。
_CRT_SECURE_NO_WARNINGS
BOOST_USE_WINDOWS_H
NOMINMAX
_CRT_SECURE_NO_DEPRECATE
注: 若需要libpcap
若需要用到libpcap
库,即安装
WpdPack_4_1_2.zip, 编译时需要的头文件和库文件
WinPcap_4_1_3.exe, 包括运行时库
将两者都解压安装到目录C:/Program Files
,并在上述配置头文件路径,库文件路径,库文件依赖时,分别添加下面三部分即可
C:\Program Files\WpdPack_4_1_2\WpdPack\Include
C:\Program Files\WpdPack_4_1_2\WpdPack\Lib\x64
wpcap.lib
ws2_32.lib
注: 若需要使用其他版本的PCL,VTK
若需要使用其他版本的PCL,VTK,那么在填写依赖库文件时,会有大量的文件名需要获取,以及debug/release版本需要区分。建议使用bat脚本的方式获取,如下。
参考: 批量获取文件名
win10安装PCL
@echo off
for %%I in (*.lib) do echo %%I>>all.txt
for %%I in (*d.lib) do echo %%I>>adebug.txt
for %%I in (*8.2.lib) do echo %%I>>arelease.txt
pause
根据需求修改匹配的版本号,将该bat脚本放置在库文件内运行即可。
2.Ubuntu环境下
我还是喜欢全家桶的方式一键安装的。
从0开始编译
拒绝从0开始编译,弄了两天头疼,问题比我头发还多,需要的可以参考大佬的:
PCL release
VTK release
完整流程:
出现问题:
- Cmake 编译安装 VTK-7.1.1 时CMake Error:Found unsuitable Qt version “xxx”
这种情况是编译低版本的VTK时,默认的是Qt4,而系统的是Qt5。更改cmake的qt为5即可。
cmake时qt版本问题 - 编译VTK时CMAKE中找不到Qt5X11Extras
缺少了,安装即可sudo apt install libqt5x11extras5-dev
Qt5X11Extras问题 - 直接在板子上编译PCL时直接卡死。算了吧
- io.h编译出错
pcl/io/pcd_io.h代替pcl/io/io.h
方便快捷先进的一键安装
sudo apt install libpcl-dev
但是!因为Ubuntu中版本适配问题,不同Ubuntu版本执行该操作,会安装不同版本的PCL和VTK。如果是Ubuntu22的话…感受高版本PCL兼容问题的痛苦吧
可以先查看相应版本的信息 apt list libpcl-dev -a
或者apt-cache policy libpcl-dev
知晓libpcl-dev的版本。
测试
按照这里的测试方式即可ubuntu20.04下安装pcl
或者
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
int main (int argc, char** argv)
{
pcl::PointCloud<pcl::PointXYZ> cloud; // Fill in the cloud data
cloud.width = 5;
cloud.height = 1;
cloud.is_dense = false;
cloud.points.resize (cloud.width * cloud.height);
for (std::size_t i = 0; i < cloud.points.size (); ++i)
{
cloud.points[i].x = 1024 * rand () / (RAND_MAX + 1.0f);
cloud.points[i].y = 1024 * rand () / (RAND_MAX + 1.0f);
cloud.points[i].z = 1024 * rand () / (RAND_MAX + 1.0f);
}
pcl::io::savePCDFileASCII ("test_pcd.pcd", cloud);
std::cerr << "Saved " << cloud.points.size () << " data points to test_pcd.pcd." << std::endl;
for (std::size_t i = 0; i < cloud.points.size (); ++i)
std::cerr << " " << cloud.points[i].x << " " << cloud.points[i].y << " " << cloud.points[i].z << std::endl;
return (0);
}