ceres库交叉编译
在rk3399pro上测试cartographer建图的时候发现后端任务阻塞非常严重,导致基本没有回环的效果,查了好久才发现是使用的ceres库没有链接稀疏矩阵计算库SuiteSparse,只能用默认的DENSE_QR,求解过程非常慢,相差百倍的量级。交叉编译依赖SuiteSparse的ceres库非常麻烦,折腾了一天,试了好多方式后最终整理一下一个比较简单而且可行的方法,下面是编译的过程:
1、 安装依赖库
在笔记本Ubuntu下安装依赖库
1.1、安装 glog 和 gflags
sudo apt-get install libgoogle-glog-dev libgflags-dev
1.2、安装 BLAS 和 LAPACK
sudo apt-get install libatlas-base-dev
1.3、安装 eigen
sudo apt-get install libeigen3-dev
1.4、安装 SuiteSparse 和 CXSparse
sudo apt-get install libsuitesparse-dev
2、下载ceres源码和编译
2.1、下载源码
git clone https://github.com/ceres-solver/ceres-solver.git
2.2、配置编译器
在ceres源码工程的CMakeLists.txt文件中添加如下内容:
SET(TOOLCHAIN_DIR "/home/yps/rk3399pro_sdk") # 根据自己实际的SDK目录进行设置
SET(CMAKE_Fortran_COMPILER ${TOOLCHAIN_DIR}/bin/aarch64-linux-gnu-gfortran)
SET(CMAKE_C_COMPILER ${TOOLCHAIN_DIR}/bin/aarch64-linux-gnu-gcc)
SET(CMAKE_CXX_COMPILER ${TOOLCHAIN_DIR}/bin/aarch64-linux-gnu-g++)
2.3、将 glog 和 gflags 的头文件拷贝到ceres源码工程(如果在编译的时候报错找不到glog.h文件时执行此操作)
从系统 /usr/include/ 目录将 glog 和 gflags 文件夹拷贝到ceres源码工程的include文件夹下
2.4、进入ceres源码目录,编译ceres库
mkdir build && cd build
cmake ..
make -j4
如果执行cmake ..
后看到输出如下信息则说明成功链接SuiteSparse库:
-- Found SuiteSparse: TRUE (found version "5.7.1")
-- Found SuiteSparse 5.7.1, building with SuiteSparse.
-- Found CXSparse: /usr/include/suitesparse (found version "3.2.0")
-- Found CXSparse version: 3.2.0, building with CXSparse.
如果输出是Not Found则是没有成功链接。
当编译输出构建完成 libceres.a 时则可以在 build/lib 目录找到ceres库。
整个源码工程的编译还会编译一些测试的程序,可能编译的时候会出现报错,但是不重要,当成功编译出 libceres.a 时已经可以终止编译了。