1 PCL的安裝
編譯環境是vs2019 professional + win10
1.1 下載。
https://github.com/PointCloudLibrary/pcl/releases
下載這兩個文件。
既然要編譯源代碼,為何又要下載他的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
當然你可以安裝在其他目錄
1.3 再安裝openni:
.\3rdParty\OpenNI2\OpenNI-Windows-x64-2.2.msi
注意修改安裝目錄到當前目錄,別默認安裝目錄,一會兒找不到他在哪里了
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下面可以看到很多第三方的庫。
把缺失的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添加到
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;
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
編譯通過
然后把生成exe的目錄換到之前安裝的目錄上去:
E:\project\camera\project\PCL\bin\bin
於是我們看到編譯好的exe已經出現在E:\project\camera\project\PCL\bin\bin中了
現在准備點雲pcd文件
到現在為止,一切准備就緒了,打斷點,運行試試
兔子出來了!
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
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的形式提供給其他軟件調用。
現在出了一堆錯誤
2.2.1
切換EIGEN的目錄:
再點擊Configure
這個時候說的是FLANN的目錄沒有指定
再點擊Configure按鈕
因為我的電腦是AMD的,並沒有cuda,所以我就要去掉cuda
去掉這個WITH_CUDA
去掉WITH_PCAP
去掉這個WITH_PCAP
Qhull的目錄設好
這個QT的部分,我之前電腦上已經安裝QT了,而且也安裝了anaconda3,他自動找到了
設定安裝目錄:
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
設定好目錄
在Configure
VTK還是不行。
那就先編譯VTK把
這個cmake先關閉
重新打開cmake-gui,把源代碼切換到剛才現在的vtk中,Build目錄另外找一個目錄
點擊Configure,出錯,一堆紅色,再點擊Configure,ok
這個地方要注意,把那個VTK的安裝目錄不要設置在C盤,C盤的讀寫需要特定權限,我把他設定在
E:\project\camera\project\PCL\bin\3rdParty\VTK
如圖:
再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就被安裝了,
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按鈕添加:
繼續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
找到這個出錯的項目
如上圖所示:
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就可以了
編譯完成以后,開始安裝:
把INSTALL這個目錄上右鍵選Set as Startup Project,然后INSTALL 右鍵Build。
發現這個PCL被安裝到
E:\project\camera\project\PCL\bin\bin
下面了
現在刪除掉之前安裝包安裝的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。
運行:
啥也沒有啊
點擊畫面,滾動鼠標
Ok
有問題聯系我: panxixue@qq.com