Arm Linux ceres库编译(树莓派5上编译)

由于工作需要,需在国产化系统上编译ceres库,手上有一块树莓派,就在树莓派上面进行测试编译ceres库,总体来说比较顺利。只出现了一点小问题
参考链接:
Ceres中文教程-安装
Ceres官方网站(英文)
按照上面Linux编译过程

系列博客:
1、x86 Linux ceres库编译(麒麟V10 SP1)
2、linux ceres库编译注意事项及测试demo

共享源码包

源码包包含ceres库、abseil库、GTest库、cmake3.30.8
CSDN下载链接:https://download.csdn.net/download/weixin_42727069/90523593

1、在线安装依赖项

1.1、安装CMake

sudo apt-get install cmake

这里要注意一下,有些系统上有cmake,可以通过下面命令查看一下cmake版本,如果cmake版本低于3.16后面编译absl库的时候可能会出问题,至于怎么升级cmake可以参考博客后面升级cmke方法

cmake --version

arm系统cmake版本3.25.1
在这里插入图片描述

1.2、安装google-glog + gflags

sudo apt-get install libgoogle-glog-dev

1.3、安装 BLAS & LAPACK

sudo apt-get install libatlas-base-dev

1.4、安装 Eigen3

sudo apt-get install libeigen3-dev

1.5、安装SuiteSparse

sudo apt-get install libsuitesparse-dev

2、编译ceres库

2.1下载ceres库源代码

git clone https://ceres-solver.googlesource.com/ceres-solver

2.2 编译

首先说明,编译结果想单独放在某个文件夹中,按照我的习惯,喜欢在源码中新建build文件夹,然后将所有编译的输出都放到build中

cd ceres-solver
mkdir build
cmake ..

注意,在cmake …容易出错(我是按照参考链接的过程进行编译的)。依次存在下面两个问题,所以在安装库前可以先把下面两个问题的源码也同样编译一遍

异常1、缺少absl库

异常输出:

CMake Error at CMakeLists.txt:173 (find_package):
  By not providing "Findabsl.cmake" in CMAKE_MODULE_PATH this project has
  asked CMake to find a package configuration file provided by "absl", but
  CMake did not find one.

  Could not find a package configuration file provided by "absl" with any of
  the following names:

    abslConfig.cmake
    absl-config.cmake

  Add the installation prefix of "absl" to CMAKE_PREFIX_PATH or set
  "absl_DIR" to a directory containing one of the above files.  If "absl"
  provides a separate development package or SDK, be sure it has been
  installed.

在这里插入图片描述

解决方案:

参考链接:
在ubuntu安装c++版本的absl库

第一步、下载abseil库

git clone https://github.com/abseil/abseil-cpp.git

第二步、编译

cd abseil-cpp
mkdir build
cd build

cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local
make -j
sudo make install

这将会将 absl 安装到 /usr/local 目录下。

安装完成后,您可以在 C++ 代码中使用 absl。例如:


#include <iostream>
#include "absl/strings/str_cat.h"
 
int main() {
  std::string s = absl::StrCat("Hello, ", "world!");
  std::cout << s << std::endl;
  return 0;
}

编译时需要链接 absl 库,例如:

g++ -o main main.cpp -labsl_strings

异常2、缺少GTest库

继续cmake编译的时候,出现了异常2,异常输出

Could NOT find GTest (missing: GTEST_LIBRARY GTEST_INCLUDE_DIR
  GTEST_MAIN_LIBRARY) (Required is at least version "1.14.0")

在这里插入图片描述

解决方案:

参考链接:
gtest教程(记录小白从0学习gtest的过程)

下载GTest源码(码云)

git clone https://gitee.com/fkliuyanhong/googletest.git

编译gtest

cd googletest
mkdir build
cd build

cmake ..
make
sudo make install

两个问题解决后cmake成功了,cmake成功截图如下:
在这里插入图片描述

2.3、继续编译

继续向下编译,依次执行下面命令:

make -j3
make test
make install 

在最后执行make install出错

异常3、missing Abseil version
CMake Error at cmake_install.cmake:46 (message):
  Cannot generate CeresConfig.cmake due to missing Abseil version.  Using
  resulting package configuration will likely result in integration errors.
  Set absl_VERSION manually to disable this error message.

在这里插入图片描述

解决方案:

这个错误是通过deepseek告诉我的解决方案
刚刚在下载absl库的时候使用的是git下载的,所以在后面直接用git log查看版本,我查到的是如下:
在这里插入图片描述
所以自定义版本为:20250321
然后带着版本号重新编译一遍即可,依次执行下面命令

cd build   (保证还是在build目录下就行了)

cmake -Dabsl_VERSION=20250321 ..
make
sudo make install 

ceres库成功编译完成
在这里插入图片描述

终极解决方案:

虽然上面编译可以成功,但是有很多后遗症,中级解决方案
首先进入github仓库:https://github.com/abseil/abseil-cpp
点击Tags
在这里插入图片描述
根据版本号重新下载一个与ceres库相近时间的版本进行下载,版本号就是这个Tags号,如:20230125.3

至此 辉 2025.3.22

x86麒麟操作系统上编译ceres可以参考我另一篇博客,目前已经走通了,避免本文冗长,特此分成两篇文章记录!!——辉2025.4.10

2025.4.16 重新修正

### 关于Ceres的交叉编译方法 对于不同平台上的应用需求,Ceres支持多种方式下的交叉编译。当目标是在非本地架构上部署应用程序时,这显得尤为重要。 #### Android平台上使用CMake进行Ceres的交叉编译 为了适应Android环境并利用其NDK工具链,在命令行环境下通过指定特定参数来调用CMake可实现对Ceres的有效交叉编译[^2]。此过程涉及下载必要的依赖项如Eigen,并调整`CMakeLists.txt`中的配置选项以匹配目标平台的要求。编写专门用于自动化这一流程的shell脚本能够简化操作步骤,提高效率。最终产物不仅限于静态链接(`libceres.a`),还可以进一步集成至Android Studio项目中作为动态链接使用。 #### Windows环境中针对ARM架构的Ceres与SuiteSparse联合交叉编译 考虑到某些应用场景可能需要在基于ARM架构的设备上运行由Windows主机端编译得到的应用程序实例,则可以通过预先安装适用于该场景的工具链来进行相应的设置工作。具体而言,依据官方文档指导完成初步准备工作之后,重点在于正确指定期望的目标处理器类型以及相应版本号等细节信息,从而确保整个编译过程中不会因为体系结构差异而引发兼容性问题[^3]。 ```bash # 示例:定义环境变量指向已安装好的GCC ARM cross compiler路径 export CC=/path/to/arm-linux-gnueabi-gcc export CXX=/path/to/arm-linux-gnueabi-g++ ``` 一旦上述准备就绪,便可以直接执行常规的CMake指令启动实际编译任务: ```bash mkdir build && cd build cmake .. -DCMAKE_TOOLCHAIN_FILE=<Path_to_toolchain_file> \ -DANDROID_ABI=armeabi-v7a \ -DEigen3_DIR=${EIGEN_ROOT}/share/eigen3/cmake/ make -j$(nproc) ``` 成功完成后,预期可在`build/lib`目录下发现所需的`libceres.a`文件[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值