pcl是做什么的在此就不解释了,否则你也不会点开这篇博客看,直入主题。
1、Miniconda
装Miniconda的目的是因为 pcl android 编译包用到了conan,为了不污染整个python环境,使用miniconda创建一个新环境,这个直接跟着官网步骤走。
mkdir -p ~/miniconda3
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda3/miniconda.sh
bash ~/miniconda3/miniconda.sh -b -u -p ~/miniconda3
rm ~/miniconda3/miniconda.sh
激活环境并初始化。
source ~/miniconda3/bin/activate
conda init --all
2、配置conan环境
sudo apt install cmake git make ninja python3-pip
pip install -U conan==1.66.0
这一步指定conan安装的版本,如果直接安装,会安装conan 2.X版本,而我们使用的pcl android编译脚本用的是1.X版本的,使用新版的话代码改动较大。
3、安装最新的根证书
conan config install https://github.com/conan-io/conanclientcert.git
4、设置conan仓库
conan remote add conan-center https://center.conan.io
conan remote list #查看设置是否成功
conan-center: https://center.conan.io [Verify SSL: True]#查询到的仓库地址
5、拉取项目
git clone https://github.com/bashbug/pcl-for-android.git
6、修改使用NDK21版本
1)修改profile中的ndk版本
修改conan-profile下面的文件,把[build-requires]下面的android-toolchain/r20@bashbug/stable修改为android-toolchain/r21@bashbug/stable即可。
2)修改android-toolchain中的ndk版本
打开conanfiles/android-toolchain/conanfile.py,修改version = "r20"为version = “r21”
7、修改boost源码下载地址
打开conanfiles/boost/conanfile.py,修改source(self)方法的内容如下:
tools.get("https://boostorg.jfrog.io/artifactory/main/release/{}/source/{}.tar.gz".format(self.version, self.folder_name))
原本的下载地址已经失效,无法下载。原下载地址为
tools.get("https://dl.bintray.com/boostorg/release/{}/source/{}.tar.gz".format(self.version, self.folder_name))
8、修改lz4的版本
原本的lz4版本是1.9.1,在conan仓库中已经不支持该版本了,因此需要修改为1.9.2版本。需要修改2个文件,一个是lz4的conan文件,一个是flann的文件,因为flann中依赖lz4。
打开conanfiles/flann/conanfile.py,修改requirements部分的lz4版本号,修改后的结果如下:
self.requires("lz4/1.9.2@bashbug/stable")
打开conanfiles/lz4/conanfile.py,修改其中的version值为1.9.2,修改后的结果如下:
version = "1.9.2"
9、修改PCL配置文件
clone出来的pcl配置文件中,所依赖的eigen版本为"eigen/3.3.7@conan/stable",而该版本在conan仓库中不存在;通过查询conan仓库:
conan search eigen* -r=conan-center
Existing package recipes:
eigen/3.3.7
eigen/3.3.8
eigen/3.3.9
eigen/3.4.0
可以看到,仓库中的eigen版本后面没有conan/stable用户通道属性,因此,去掉用户通道参数即可,修改后的结果如下:
self.requires("eigen/3.3.7")
根据需要,修改PCL功能模块开关,默认以下模块被关闭,也就是不会被编译到pcl库中:
cmake.definitions["PCL_SHARED_LIBS"] = "OFF"
cmake.definitions["PCL_BINARIES"] = "OFF"
cmake.definitions["WITH_CUDA"] = "OFF"
cmake.definitions["WITH_OPENGL"] = "OFF"
cmake.definitions["WITH_PCAP"] = "OFF"
cmake.definitions["WITH_PNG"] = "OFF"
cmake.definitions["WITH_QHULL"] = "OFF"
cmake.definitions["WITH_VTK"] = "OFF"
PCL_SHARED_LIBS是控制编译共享库,我们要交叉编译,因此不打开该项;
PCL_BINARIES控制是否编译可执行文件,也就是可以命令行运行的pcl命令。pcl_binaries.patch补丁实现了该配置打开情况下编译的支持。
WITH_VTK模块不适用于Android平台,Android平台使用VES,在PCL的源码CMakeLists.txt中有这样的表述:
if(ANDROID)
set(build FALSE)
message("VTK was found, but cannot be compiled for Android. Please use VES instead.")
endif()
其他模块打开,需要增加对应的配置参数,而且模块间有依赖关系,如VTK依赖OPENG;具体如何配置,还不熟悉,有空再研究。
10、编译
armeabi-v7a
./pcl-build-for-android.sh armeabi-v7a
arm64-v8a
./pcl-build-for-android.sh arm64-v8a
如果编译有错,仔细看错误信息,对应修改即可。
11、代理设置
从第6步到第9步,网络没问题的话基本能顺利通过,可惜我的网络没那么好,需要设置代理,我用的vmware虚拟机,主机有代理,网络设置NAT模式,设置虚拟机代理,如果只在一个终端生效,可做如下设置。
export http_proxy=http://XX.XX.XX.XX:XXXX //用你自己的代理配置
export https_proxy=http://XX.XX.XX.XX:XXXX //用你自己的代理配置
第9步pcl代码在github上死活克隆不下来,找了gitee的镜像,pcl 1.9.1
12、导出PCL库和头文件
编译出来的pcl库和头文件以及相关依赖,按照模块分别存放,主要输出在./conan/data下面,类似以下结构:
├── android-toolchain
├── boost
├── eigen
├── flann
├── lz4
├── pcl
android-toolchain是自动下载的r21版本的NDK,适用于Linux平台,没有包含windows平台的有关文件,因此不能直接拉到windows下使用。
lz4是flann依赖的模块,编译后,已经包含在flann中,因此不需要单独拉取;
boost、eigen、flann、pcl这4个模块是需要拉取出来的,形成一个pcl库和头文件的集合,供其他Android项目使用。要注意:我们所需要拉取的不是./conan/data下的内容全部,而是每个模块对应版本下面的bashbug/stable/××××下面的lib和include2个文件夹,具体各个模块要拉取的目录如下:
.conan/data/boost/1.70.0/bashbug/stable/package/4e65a98fd5c197b6539ce5c3062c84123c059f0c/lib
.conan/data/boost/1.70.0/bashbug/stable/package/4e65a98fd5c197b6539ce5c3062c84123c059f0c/include
.conan/data/eigen/3.3.7/_/_/package/5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9/include/eigen3/
.conan/data/flann/1.9.1/bashbug/stable/package/42aed23ccd4c3006a79a880ba523d6d45486ac63/lib
.conan/data/flann/1.9.1/bashbug/stable/package/42aed23ccd4c3006a79a880ba523d6d45486ac63/include
.conan/data/pcl/1.9.1/bashbug/stable/package/edf8fc3f2f92012e3ef85012b21cfa3182a52d47/lib
.conan/data/pcl/1.9.1/bashbug/stable/package/edf8fc3f2f92012e3ef85012b21cfa3182a52d47/include
package后面的文件夹名称时编译时自动生成的,因此,每次编译都不相同。
在windows下创建pcl文件夹,比如:pcl-android-191-build/build,在build下面分别创建boost-android、flann-android、pcl-android,把上述对应的内容拉取到对应模块的文件夹下面。
拉取后的结构如下:
├── pcl-android-191-build
│ └── build
│ └── boost-android
│ └── include
│ └── lib
│ └── eigen
│ └── Eigen
│ └── unsupported
│ └── flann-android
│ └── include
│ └── lib
│ └── pcl-android
│ └── include
│ └── lib