PCL 1.12.0 在 win10 vs2019下的安装与源代码编译。

 

1 PCL的安装

编译环境是vs2019 professional + win10

1.1 下载。

https://github.com/PointCloudLibrary/pcl/releases

PCL 1.12.0 在 win10  vs2019下的安装与源代码编译。

下载这两个文件。

既然要编译源代码,为何又要下载他的AllInOne的二进制版本呢?这是因为PCL-1.12.0-AllInOne-msvc2019-win64.exe安装以后,他可以把附带的一堆第三方的库安装进去,我们后面要编译PCL源代码的时候需要这些库。

1.2 先安装整个包

PCL-1.12.0-AllInOne-msvc2019-win64.exe

这个包里面把第三方的库都搞好了,我们就不必在到处找库了。

我的安装的目录是在:

E:\project\camera\project\PCL\bin

当然你可以安装在其他目录

PCL 1.12.0 在 win10  vs2019下的安装与源代码编译。

1.3 再安装openni:

.\3rdParty\OpenNI2\OpenNI-Windows-x64-2.2.msi

注意修改安装目录到当前目录,别默认安装目录,一会儿找不到他在哪里了

PCL 1.12.0 在 win10  vs2019下的安装与源代码编译。

1.4 寻找缺失的dll

然后E:\project\camera\project\PCL\bin\bin下面随便运行几个exe,发现缺库dll,

比如缺vtk的各种dll,那就到E:\project\camera\project\PCL\bin\3rdParty\VTK目录下面

搜索所有的dll,将其拷贝到E:\project\camera\project\PCL\bin\bin

Openni的库也是类似,把openni目录下的所有的dll也拷贝到E:\project\camera\project\PCL\bin\bin下面。

在E:\project\camera\project\PCL\bin\3rdParty下面可以看到很多第三方的库。

PCL 1.12.0 在 win10  vs2019下的安装与源代码编译。

把缺失的dll拷贝到E:\project\camera\project\PCL\bin之后,把这个目录下的各种exe运行一下,查看是否dll不再缺失。

1.5 写个例子eigen的例子测试一下

#include <iostream>

#include "Dense"

using namespace std;

using namespace Eigen;

int main()

{

MatrixXd test = MatrixXd::Zero(10, 10);

cout << test << endl;

}

Vs2019中include目录中添加E:\project\camera\project\PCL\bin\3rdParty\Eigen\eigen3\Eigen

运行通过

1.6 写个例子 pcl测试安装好的库

首先打开vs2019 生成一个控制台程序。

把当前代码替换进去:

#include<pcl/visualization/cloud_viewer.h>

#include<iostream>//标准C++库中的输入输出类相关头文件。

#include<pcl/io/io.h>

#include<pcl/io/pcd_io.h>//pcd 读写类相关的头文件。

#include<pcl/io/ply_io.h>

#include<pcl/point_types.h> //PCL中支持的点类型头文件。

int user_data;

using std::cout;

#include "E:\project\camera\project\PCL\bin\lib.h"

void viewerOneOff(pcl::visualization::PCLVisualizer& viewer) {

viewer.setBackgroundColor(1.0, 0.5, 1.0); //设置背景颜色

}

int main() {

pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);

char strfilepath[256] = "E:\\project\\camera\\project\\PCL\\bin\\bin\\rabbit.pcd";

if (-1 == pcl::io::loadPCDFile(strfilepath, *cloud)) {

cout << "error input!" << endl;

return -1;

}

cout << cloud->points.size() << endl;

pcl::visualization::CloudViewer viewer("Cloud Viewer"); //创建viewer对象

viewer.showCloud(cloud);

viewer.runOnVisualizationThreadOnce(viewerOneOff);

system("pause");

return 0;

}

注意我写的都是绝对路径,你要把pcd文件换成你自己的路径。

1.6.1 把_CRT_SECURE_NO_WARNINGS添加到

PCL 1.12.0 在 win10  vs2019下的安装与源代码编译。

1.6.2 把各种include添加进入

E:\project\camera\project\PCL\bin\3rdParty\Boost\include\boost-1_76;

E:\project\camera\project\PCL\bin\3rdParty\Eigen\eigen3;

E:\project\camera\project\PCL\bin\3rdParty\VTK\include\vtk-9.0;

PCL 1.12.0 在 win10  vs2019下的安装与源代码编译。

1.6.3 lib文件的添加

使用python 自动搜索所有的lib文件,生成一个lib.h文件,这个python代码为:

import os

from shutil import copyfile

import json

import time

from datetime import datetime

extfilenamelist = [".lib"]

libfile = open("lib.h", "w")

srcpath = os.getcwd();

index=0

for root,dirs,files in os.walk(srcpath):

for file in files:

index+=1

print("scanning "+str(index)+"\r",end="")

extfilename = os.path.splitext(file)[-1]

extfilename = extfilename.lower()

if extfilename in extfilenamelist:

file1=os.path.join(root,file)

file2= file1.replace('\\','/')

libfile.write("#pragma comment(lib,"+"\""+file2+"\")"+"\n")

libfile.close()

 

把这个python文件命名为searchlib.py,把这个文件放在E:/project/camera/project/PCL/bin下面,

运行它就会在当前目录下生成一个lib.h

 

这个lib.h 里面包含了当前目录及其子目录下所有的.lib文件。这样就避免了在vs2019中添加无数个lib文件的痛苦。

如果你不会写python就直接抄袭。但是要先安装python,我推荐你安装anaconda。

 

 

这个lib.h是这个样子:

#pragma comment(lib,"E:/project/camera/project/PCL/bin/3rdParty/Boost/lib/libboost_atomic-vc142-mt-gd-x64-1_76.lib")

#pragma comment(lib,"E:/project/camera/project/PCL/bin/3rdParty/Boost/lib/libboost_atomic-vc142-mt-x64-1_76.lib")

#pragma comment(lib,"E:/project/camera/project/PCL/bin/3rdParty/Boost/lib/libboost_bzip2-vc142-mt-gd-x64-1_76.lib")

 

 

编译后出错:

1>LINK : fatal error LNK1104: cannot open file 'libboost_date_time-vc142-mt-gd-x64-1_76.lib'

但是这个文件已经在lib.h中已经添加了,而且文件确实存在,应该是vs2019的bug

于是我们把这个文件所在的目录添加到lib的路径中:

E:\project\camera\project\PCL\bin\3rdParty\Boost\lib

PCL 1.12.0 在 win10  vs2019下的安装与源代码编译。

编译通过

然后把生成exe的目录换到之前安装的目录上去:

E:\project\camera\project\PCL\bin\bin

PCL 1.12.0 在 win10  vs2019下的安装与源代码编译。

于是我们看到编译好的exe已经出现在E:\project\camera\project\PCL\bin\bin中了

PCL 1.12.0 在 win10  vs2019下的安装与源代码编译。

现在准备点云pcd文件

PCL 1.12.0 在 win10  vs2019下的安装与源代码编译。

到现在为止,一切准备就绪了,打断点,运行试试

兔子出来了!

2 PCL 1.12.0 源代码编译

2.1 下载

从官网下载source.tar.gz这个文件,解压

进入解压后的子目录,我的目录是

E:\project\camera\project\PCL\pcl-1.12.0

2.2 cmake

如果没有安装cmake,需要先安装cmake最新版本。

在控制台下面输入cmake-gui

启动cmake

PCL 1.12.0 在 win10  vs2019下的安装与源代码编译。

Where is the source code: 指向pcl的源代码,就是刚才解压的源代码,我E:\project\camera\project\PCL\pcl-1.12.0

Where to build the binaries: 指向编译后的数据存放地点,这个可以随便指定

点击Configure按钮

然后会生成一堆东西,各种错误,实际是6个软件包的位置没有指定好,这6个软件包是:

Boost

Eigen

FLANN

OpenNI2

Qhull

VTK

这6个软件包中,有一个很特殊,Eigen他提供的是源代码,而且他很怪,源代码全是以头文件的形式提供,其他软件使用Eigen的时候,只需要把这些h文件include进入自己的源代码即可。

此外Boost是提供的静态库。

其他4个软件包都是以lib和dll的形式提供给其他软件调用。

现在出了一堆错误

PCL 1.12.0 在 win10  vs2019下的安装与源代码编译。

PCL 1.12.0 在 win10  vs2019下的安装与源代码编译。

2.2.1

PCL 1.12.0 在 win10  vs2019下的安装与源代码编译。

切换EIGEN的目录:

PCL 1.12.0 在 win10  vs2019下的安装与源代码编译。

再点击Configure

PCL 1.12.0 在 win10  vs2019下的安装与源代码编译。

这个时候说的是FLANN的目录没有指定

PCL 1.12.0 在 win10  vs2019下的安装与源代码编译。

再点击Configure按钮

PCL 1.12.0 在 win10  vs2019下的安装与源代码编译。

因为我的电脑是AMD的,并没有cuda,所以我就要去掉cuda

PCL 1.12.0 在 win10  vs2019下的安装与源代码编译。

去掉这个WITH_CUDA

去掉WITH_PCAP

PCL 1.12.0 在 win10  vs2019下的安装与源代码编译。

去掉这个WITH_PCAP

PCL 1.12.0 在 win10  vs2019下的安装与源代码编译。

Qhull的目录设好

PCL 1.12.0 在 win10  vs2019下的安装与源代码编译。

PCL 1.12.0 在 win10  vs2019下的安装与源代码编译。

这个QT的部分,我之前电脑上已经安装QT了,而且也安装了anaconda3,他自动找到了

设定安装目录:

PCL 1.12.0 在 win10  vs2019下的安装与源代码编译。

2.2.2 VTK的安装

接下来应该安装VTK_DIR了

CMake Warning at cmake/pcl_find_vtk.cmake:25 (find_package):
By not providing "FindVTK.cmake" in CMAKE_MODULE_PATH this project has
asked CMake to find a package configuration file provided by "VTK", but
CMake did not find one.
Could not find a package configuration file provided by "VTK" with any of
the following names:
VTKConfig.cmake
vtk-config.cmake

很奇怪,既然VTK实际前面已经下载,但是他只是库,这个意思是要VTK的源代码啊,那就去下载VTK源代码吧,下载后放在这里

VTK-9.1.0

PCL 1.12.0 在 win10  vs2019下的安装与源代码编译。

PCL 1.12.0 在 win10  vs2019下的安装与源代码编译。

设定好目录

在Configure

VTK还是不行。

那就先编译VTK把

这个cmake先关闭

重新打开cmake-gui,把源代码切换到刚才现在的vtk中,Build目录另外找一个目录

PCL 1.12.0 在 win10  vs2019下的安装与源代码编译。

点击Configure,出错,一堆红色,再点击Configure,ok

这个地方要注意,把那个VTK的安装目录不要设置在C盘,C盘的读写需要特定权限,我把他设定在

E:\project\camera\project\PCL\bin\3rdParty\VTK

如图:

PCL 1.12.0 在 win10  vs2019下的安装与源代码编译。

再Configure,Generate,Open Porject

在vs2019中编译非常顺利,编译完成之后,

可以发现

Skipped Build: Project: INSTALL, Configuration: Debug x64 ------

259>Project not selected to build for this solution configuration

在INSTALL这个项目上右键set startup project

在INSTALL 右键Build

于是VTK就被安装了,

PCL 1.12.0 在 win10  vs2019下的安装与源代码编译。

E:\project\camera\project\PCL\bin\3rdParty\VTK

目录上已经被安装好了

关闭cmake-gui。

重新打开cmake-gui,把build目录切换到

E:/project/camera/project/PCL/bin/build

把VTK_DIR设定为刚才VTKBild那个子目录,就是VTK编译的目录,再点击Configure,发现VTK错误不见了。

2.2.3 Boost的问题。

再Configure之后,Boost错误出现了:

Could NOT find Boost (missing: Boost_INCLUDE_DIR filesystem date_time
iostreams system) (Required is at least version "1.65.0")

这就是说Boost找不到。

但是这个里面并没有找到 Boost_INCLUDE_DIR 这一行,那就添加吧

电机Add Entry按钮添加:

PCL 1.12.0 在 win10  vs2019下的安装与源代码编译。

PCL 1.12.0 在 win10  vs2019下的安装与源代码编译。

继续Configure,无效,还是同样的错误。

到网上查资料,发现有人说:

CMake/share/cmake-3.18/Modules/FindBoost.cmake 文件里规定的debug参数: Boost_DEBUG=ON

添加一个Entry: Boost_DEBUG,设置为True

点击Configure

出现一堆调试信息

然后可以看到:

BOOST_ROOT

BOOST_INCLUDEDIR

BOOST_LIBRARYDIR

都没有设定好。于是加入3个entry

BOOST_ROOT设定为:E:\project\camera\project\PCL\bin\3rdParty\Boost

BOOST_INCLUDEDIR设定为:E:\project\camera\project\PCL\bin\3rdParty\Boost\include

BOOST_LIBRARYDIR设定为:E:\project\camera\project\PCL\bin\3rdParty\Boost\lib

Boost是一个静态库

再点击configure,似乎就过了

点击Generate,然后再点击Open Project

2.3 PCL编译

点击cmake的OpenProject后就打开了vs2019

编译,出错

Build started: Project: pcl_io

E:\project\camera\project\PCL\pcl-1.12.0\io\include\pcl/io/vtk_lib_io.h(71,10): fatal error C1083: Cannot open include file: 'vtkPolyDataNormals.h': No such file or directory

vtkPolyDataNormals.h这个文件出现在

E:\project\camera\project\PCL\bin\3rdParty\VTK\include\vtk-9.1

找到这个出错的项目

PCL 1.12.0 在 win10  vs2019下的安装与源代码编译。

PCL 1.12.0 在 win10  vs2019下的安装与源代码编译。

如上图所示:

E:\project\camera\project\PCL\bin\3rdParty\VTK\include\vtk-9.1

加入到Include Directories

编译后这个pcl_io项目就编译成功了

后面出现的错误基本都是这个情况,把

E:\project\camera\project\PCL\bin\3rdParty\VTK\include\vtk-9.1

添加到对应项目的Include Directories就可以了

编译完成以后,开始安装:

PCL 1.12.0 在 win10  vs2019下的安装与源代码编译。

把INSTALL这个目录上右键选Set as Startup Project,然后INSTALL 右键Build。

发现这个PCL被安装到

E:\project\camera\project\PCL\bin\bin

下面了

PCL 1.12.0 在 win10  vs2019下的安装与源代码编译。

现在删除掉之前安装包安装的PCL,使用新生成的PCL安装包。

运行searchlib.py,会找到全部的lib,然后生成lib.h

此时各种动态库的路径为:

E:\project\camera\project\PCL\bin\3rdParty\FLANN\bin

E:\project\camera\project\PCL\bin\3rdParty\OpenNI2\Redist

E:\project\camera\project\PCL\bin\3rdParty\Qhull\bin

E:\project\camera\project\PCL\bin\3rdParty\VTK\bin

E:\project\camera\project\PCL\bin\bin\bin

把这些DLL库的路径加入到你的PATH,下面调试后的时候好找到这些DLL。

现在把上面写好那个读PCD文件的例子用这个来编译,发现一切ok。

运行:

PCL 1.12.0 在 win10  vs2019下的安装与源代码编译。

啥也没有啊

点击画面,滚动鼠标

PCL 1.12.0 在 win10  vs2019下的安装与源代码编译。

Ok

有问题联系我: panxixue@qq.com

上一篇:PCL 迭代器(CloudIterator)源码解析及使用


下一篇:Battlestation Operational HDU 6134