首先可以参考我前期的一篇博客,基本上涵盖了ceres库的整体编译方法,只是中间遇到的问题可能会各种不同
Arm Linux ceres库编译(树莓派5上编译)
解决问题参考链接:
1、ubuntu20.04(ros-noetic)编译cartographer出现undefined reference to `absl::lts_20211102问题的解决办法
2、Ubuntu 20.04.05安装ceres-1.14.0
3、Google Test(GTEST)使用入门(1)- 下载编译安装执行
相关博客:
1、Arm Linux ceres库编译(树莓派5上编译)
2、linux ceres库编译注意事项及测试demo
目录
一、使用最新的麒麟V10操作系统
由于开始在老机器上编译,gcc版本和cmake版本过老,导致无法编译。升级这些又很麻烦,所以更换了最新操作系统,重新编译,中间走的弯路详见后面的“附:老麒麟系统上的弯路”篇章。
因为更换系统后,编译期间遇到了很多问题一直没有解决,所以这个博客没有办法继续,通过不断努力,花了大半个星期不断尝试,终于在新的麒麟操作系统上编译成功了,特此记录中间弯路
1、基本信息
操作系统信息
cmake版本
ceres 要求cmake版本不低于3.16,该系统cmake版本符合要求
gcc版本
gcc版本9.3.0
源代码共享
源代码与上一篇用的是一样的,源码包包含ceres库、abseil库、GTest库、cmake3.30.8
优快云下载链接:https://download.youkuaiyun.com/download/weixin_42727069/90523593
2、在线安装相关依赖
下面这些在线安装的东西,默认是系统都没有的,如果系统有,且版本符合要求,可以跳过对应的安装。这部分内容与我树莓派上编译安装方法是一样的,都是高版本基本上没有什么问题
2.1、安装cmake
sudo apt-get install cmake
检查cmake版本,要求版本不低于3.16
cmake --version
2.2、安装google-glog + gflags
sudo apt-get install libgoogle-glog-dev
2.3、安装 BLAS & LAPACK
sudo apt-get install libatlas-base-dev
2.4、安装 Eigen3
sudo apt-get install libeigen3-dev
2.5、安装SuiteSparse
sudo apt-get install libsuitesparse-dev
2、离线手动编译部分
2.1、编译absl库
这部分有所不同,主要困在这里,如果按照以前操作方法编译,也可以顺利编译过,但是在编译ceres的时候会在73%左右出现错误
错误信息如下:
按照deepseek建议搞了一下,还是有下面的错误
后面参考了文章开头的那个参考链接解决方法,所以这里就直接一步到位,写出正确的编译方式
cd abseil-cpp
mkdir build
cd build
#关键是增加-DCMAKE_CXX_STANDARD=17这段话
cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local -DCMAKE_CXX_STANDARD=17
#编译在build文件夹下
make
#安装在系统内
sudo make install
2.2、编译GTest库
对于这个库,也困扰了我很久,倒不是因为这个库难得编译,而是这个库编译成功后在后面ceres库编译的时候还是报错,错误详情如下
对于这个错误后面采用忽略模式解决的,具体后面在编译ceres库的时候增加了一个配置解决的,这种方法是deepseek建议的。
GTest库的编译方法还是按照上一篇的操作
cd googletest
mkdir build
cd build
cmake ..
make
sudo make install
2.3、编译ceres库
终于到了这里了,在这里反复操作了很多次,终于编译过了
#注意cmake后面的精髓是-DBUILD_TESTING=OFF 忽略了GTest部分编译,我在这里困了很久,用低版本googletest1.8.1和高版本googletest1.14.0都进行了测试,错误也不一样,但是错误的位置是一样,都是在26%的时候报错,增加了这一段后问题解决了。
cd ceres-solver
mkdir build
cd build
cmake .. -DBUILD_TESTING=OFF
make
sudo make install
make成功界面
install成功界面
至此,终于x86 linux ceres编译成功了,特此记录!!!——辉 2025.4.10
2025.4.15 附加:
比较粗心,事实上在sudo make install的时候并没有成功安装,注意下图(这样会导致在进行C++工程编译的时候有各种错误)
这个问题和上个版本在arm上编译遇到的问题是一样的,就是没有设置absl的版本号,所以重新增加版本号设置,再来一次即可
cmake .. -DBUILD_TESTING=OFF -Dabsl_VERSION=20250321
make
sudo make install
最终成功界面如下,会在本地/usr/local目录下进行
至此,x86 麒麟上完美编译成功了
附:老麒麟系统上的弯路
那个虚拟机一直用于测试,有四五年了,麒麟系统信息如下
开始编译就遇到了各种问题,主要是系统版本较低,导致的
麒麟系统下编译遇到的问题:
问题1,cmake版本过低,升级cmake
执行cmake … -DCMAKE_INSTALL_PREFIX=/usr/local命令时,提示下面错误,该错误主要是说要求cmake版本不低于3.16,我的版本为3.10.2
1.1、查看cmake版本
在网上查找了很多方法,我觉得不怎么靠谱,卸载cmake再安装都试过,没有什么用。最后只能使用杀手锏,源码编译安装
参考链接:
升级Cmake
1.2、源码下载
推荐cmake官网下载:官网地址
选择源码下载,如下图:
有时候会下载出错,多试几次就成功。文章开头我会把我下载的所有待编译库的源码共享出来,也可以通过我提供的地址进行下载。
1.3、源码编译
解压安装包
tar -zxvf cmake-3.30.8.tar.gz
进入目录进行编译
cd cmake-3.30.8
./bootstrap --prefix=/usr
sudo make
sudo make install
注意:./bootstrap --prefix=/usr 这一步很关键,如果没有指定prefix,后面使用时会报错Could not find CMAKE_ROOT
执行完后再去查看cmake版本,发现已经变过来了
问题2,absl/time/time.cc编译问题,absl::Duration
cmake版本升级成功了,继续执行cmake … -DCMAKE_INSTALL_PREFIX=/usr/local命令时,提示下面错误,该错误主要是说absl::Duration相关的constexpr函数调用上
deepseek解释:
感觉是GCC版本低了
树莓派arm版本的gcc
虚拟机上的gcc版本:
升级gcc比较麻烦。算了,重新安装新版本麒麟系统,再编译看看吧(未完待续 . . .)