首页 > 其他分享 >编译android版本的pcl库

编译android版本的pcl库

时间:2025-01-02 14:58:04浏览次数:1  
标签:eigen 编译 conan pcl stable android

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

参考

PCL-1.9.1 for Android ndk21编译

标签:eigen,编译,conan,pcl,stable,android
From: https://www.cnblogs.com/weiweiting/p/18647708

相关文章

  • Linux内核编译
    Linux内核编译实验内容下载内核源码:确定内核版本号uname-r在www.kernel.org选择接近的内核版本下载linux-6.6.60.tar.xz将压缩包解压到虚拟机目录中确认系统位数getconfLONG_BIT确认虚拟机保留足够大硬盘空间(20G)df-h编写自定义系统调用函数修改/kernel/sys......
  • 内核编译与系统调用
    Linux内核编译实验内容下载内核源码:确定内核版本号uname-r在www.kernel.org选择接近的内核版本下载linux-6.6.60.tar.xz将压缩包解压到虚拟机目录中确认系统位数getconfLONG_BIT确认虚拟机保留足够大硬盘空间(20G)df-h编写自定义系统调用函数修改/kernel/sys......
  • 解释型语言和编译型语言的差异是什么?
    解释型语言和编译型语言是两种不同的编程语言类型,它们在执行程序时的方式和过程上存在显著区别。这些差异对于前端开发尤为重要,因为它们直接影响到代码的执行效率、开发流程以及跨平台兼容性。以下是解释型语言和编译型语言在前端开发中的主要差异:执行过程:解释型语言(如JavaSc......
  • lio_sam_6axis编译报错解决办法
    lio_sam_6axis编译需要现安装gtsam4.0.2wget-O~/Downloads/gtsam.ziphttps://github.com/borglab/gtsam/archive/4.0.2.zipcd~/Downloads/&&unzipgtsam.zip-d~/Downloads/cd~/Downloads/gtsam-4.0.2/mkdirbuild&&cdbuildcmake-DGTSAM_BUILD_WITH......
  • MinGW-w64编译器和编译问题
    1、不同版本的MinGW带有不同GNU版本,默认支持的C++标准不一致,编译时有时会报错,查看默认支持的命令如下echo|g++-dM-E-xc++-|find"cplusplus"(windows)echo|g++-dM-E-xc++-|grep__cplusplus(linux)#define__cplusplus201703L表示默认支持标准为C++172、......
  • MinGW和MSVC编译器--C2001: 常量中有换行符
    1、两者编译的库不能通用,例如OpenCV(window)是MSVC编译的,Qt中使用MinGW编译器调用OpenCV的dll会报错。2、用MinGW编译通过的源码,换MSVC编译报错如下,主要原因是:编译器对字符的支持不同,深入了解可参考下方链接https://zhuanlan.zhihu.com/p/146543940https://blog.csdn.net/aoxues......
  • 超详细!uni-app Android本地打包傻瓜式教程
    前言本教程将指导您完成uni-app项目的Android本地打包过程。通过本地打包,您可以更好地控制应用的打包过程,实现更多自定义配置。一、申请应用标识1.1获取DCloudAppID登录DCloud开发者中心创建一个新应用点击创建后的项目创建证书,需要等一会儿时间,1分钟左右,可能......
  • 用仓颉完成编译原理实验-消除左递归和左公共因子,求FIRST集和FOLLOW集
    目录实验目的实验内容实现消去上下文无关文法中所有左递归的算法实现从上下文无关文法中提取左公共因子的算法实现求解上下文无关文法的FIRST集和FOLLOW集的算法设计方案与算法描述设计文法的数据结构实现消去上下文无关文法中所有左递归的算法实现从上下文无关文法中......
  • 用仓颉完成编译原理实验-正规式转NFA转DFA
    目录实验目的实验要求1.输入输出要求:2.算法要求:3.数据结构要求:算法描述正规式转NFA算法描述NFA转DFA算法描述测试结果实验随手记对仓颉的感受实验目的1.掌握正规表达式与有限自动机的基本概念和转换方法。2.了解非确定有限自动机(NFA)的构建过程。3.熟悉编......
  • Ts编译流程
    安装建议全局安装npmi-gtypescript安装好之后,就可以直接使用tsc来编译ts文件了编译我们现在可以创建一个ts文件,并将他编译成js文件,比如下面简单的代码letstr:string="hello";但是,就是这么简单的代码,编译之后却会报错。不用担心,这个错误,并不是我们的错误,原因是默认......