PCL 1.12.0 在 win10 vs2019下的安裝與源代碼編譯。


 

1 PCL的安裝

編譯環境是vs2019 professional + win10

1.1 下載。

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

clip_image002

下載這兩個文件。

既然要編譯源代碼,為何又要下載他的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

當然你可以安裝在其他目錄

clip_image004

1.3 再安裝openni:

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

注意修改安裝目錄到當前目錄,別默認安裝目錄,一會兒找不到他在哪里了

clip_image006

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下面可以看到很多第三方的庫。

clip_image008

把缺失的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添加到

clip_image010

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;

clip_image012

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

clip_image014

編譯通過

然后把生成exe的目錄換到之前安裝的目錄上去:

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

clip_image016

於是我們看到編譯好的exe已經出現在E:\project\camera\project\PCL\bin\bin中了

clip_image018

現在准備點雲pcd文件

clip_image020

到現在為止,一切准備就緒了,打斷點,運行試試

兔子出來了!

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

clip_image022

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的形式提供給其他軟件調用。

現在出了一堆錯誤

clip_image024

clip_image026

2.2.1

clip_image028

切換EIGEN的目錄:

clip_image030

再點擊Configure

clip_image032

這個時候說的是FLANN的目錄沒有指定

clip_image034

再點擊Configure按鈕

clip_image036

因為我的電腦是AMD的,並沒有cuda,所以我就要去掉cuda

clip_image038

去掉這個WITH_CUDA

去掉WITH_PCAP

clip_image040

去掉這個WITH_PCAP

clip_image042

Qhull的目錄設好

clip_image044

clip_image046

這個QT的部分,我之前電腦上已經安裝QT了,而且也安裝了anaconda3,他自動找到了

設定安裝目錄:

clip_image048

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

clip_image050

clip_image052

設定好目錄

在Configure

VTK還是不行。

那就先編譯VTK把

這個cmake先關閉

重新打開cmake-gui,把源代碼切換到剛才現在的vtk中,Build目錄另外找一個目錄

clip_image054

點擊Configure,出錯,一堆紅色,再點擊Configure,ok

這個地方要注意,把那個VTK的安裝目錄不要設置在C盤,C盤的讀寫需要特定權限,我把他設定在

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

如圖:

clip_image056

再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就被安裝了,

clip_image058

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按鈕添加:

clip_image060

clip_image062

繼續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

找到這個出錯的項目

clip_image064

clip_image066

如上圖所示:

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就可以了

編譯完成以后,開始安裝:

clip_image068

把INSTALL這個目錄上右鍵選Set as Startup Project,然后INSTALL 右鍵Build。

發現這個PCL被安裝到

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

下面了

clip_image070

現在刪除掉之前安裝包安裝的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。

運行:

clip_image072

啥也沒有啊

點擊畫面,滾動鼠標

clip_image074

Ok

有問題聯系我: panxixue@qq.com


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM