0. 前言
前一篇文章里面,已经完成了 Ubuntu 18.04 和 ROS Melodic 的安装。
还没有安装好的读者,可以回去看这一篇文章。
前情概要:
LVI_SAM虚拟机安装复现(一)
本文主要记录了GTSAM源码编译安装过程中经历的坑
警告:并非从零开始零基础教你安装 GTSAM 哦
GTSAM是一个开源库,作用是数据平滑和地图构建的重要工具
对于LVI_SAM 来说是至关重要的库,这个库安装,直接影响后面 LVI_SAM 系统的编译,所以本文是非常关键的,请一定要重视起来。
1. GTSAM 源码下载
先clone到本地,当前(20250227)的最新版本是4.3
git clone https://github.com/borglab/gtsam.git
然后先创建个build文件夹
mkdir build && cd build
2. 第一个坑 cmake 配置
先敲一下pwd,看看当前路径是不是在build下
cmake配置
cmake -DGTSAM_BUILD_WITH_MARCH_NATIVE=OFF .. //直接cmake可能会报错
记住这里要加-DGTSAM_BUILD_WITH_MARCH_NATIVE=OFF
而且后面的..别忘记,cmake的用法就是要加路径的
3. 第二个坑 make install -j1
我们知道cmake是用来生成Makefile的
接下来就应该make了
这里即可以用下面的命令,一次性完成编译和安装
make install -j1
也可以先 make -j1
,再 make install
我这里会遇到编译错误:
/home/ros/lvi_sam_workspace/gtsam/gtsam/discrete/Assignment.h:93:29: error: unused variable ‘_’ [-Werror=unused-variable]for (const auto& [idx, _] : keys) assignment[idx] = 0; // Initialize from 0^
代码本身是没问题的,我问了kimi,他告诉我说大概率是编译器没有支持最新的C++17语法导致的,那么就说明编译g++版本不够新。
我用以下的命令查看 g++ 版本
g++ --version
我发现自己版本才7.5,于是考虑到升级到g++11
可以参考这个文章,升级g++11的方法:
【Ubuntu】如何安装gcc11 g++11, Ubuntu18,Ubuntu20,Ubuntu22_ubuntu安装gcc11-CSDN博客
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt install gcc-11 g++-11 -y
不过,光升级gcc g++也不行,升级完以后还是会用默认的g++版本,你还需要将g++11设置为默认的编译器
如果不设置g++11为默认的g++编译器,那么编译的时候还是会继续用默认的g++(一般是g++7,这样还是会没法支持最新的c++17语法功能)
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 100 --slave /usr/bin/g++ g++ /usr/bin/g++-11
记得删除之前的缓存,这里缓存如果不删掉的话,cmake会直接用之前的结果,你的修改就没有意义了。
rm -f CMakeCache.txt
然后现在再执行之前的cmake命令
cmake -DGTSAM_BUILD_WITH_MARCH_NATIVE=OFF .. //直接cmake可能会报错
就可以看到下面的信息,说明已经能识别到正确的g++版本了
CMAKE_CXX_COMPILER_VERSION : 11.4.0
现在再执行一次 make install -j1
一般就不会再报错了。
如果还有报错的话,建议回过头去cmake看看 CMAKE_CXX_COMPILER_VERSION 是否已经升级到 9 以上了
4. 测试 GTSAM
前面的 make install -j1
如果不再报错,一般会得到类似下图的结果。
说明相关的库文件都已经安装到 /usr/local/lib
里了
但是我们要知道,这个路径其实是不能被直接找到的。一般编译器可以直接找到的是系统库路径,也就是 /usr/lib
那么我们就应该把 /usr/local/lib
手动添加到环境变量里。
环境变量在哪里改?
配置环境变量
如果库文件路径正确,但系统未正确识别,可以将库路径添加到环境变量中:
-
在
~/.bashrc
文件中添加以下内容:export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
-
重新加载配置:
source ~/.bashrc
写一个测试代码(包括CMakeLists.txt)
然后我们参考这篇文章的内容,写一段代码 Ubuntu18.04安装GTSAM库并验证GTSAM是否安装成功(亲测可用)
可以建一个文件夹,里面放2个文件,一个CMakeLists.txt,一个 main.cpp
我这里放一下自己的内容:
除了红框是自己写的,其他文件都是 cmake .
自动生成的。
CMakeLists.txt内容
cmake_minimum_required(VERSION 3.0)
project(gtsam_check)# 设置C++标准
set(CMAKE_CXX_STANDARD 17)# 找到GTSAM库
find_package(GTSAM REQUIRED)# 添加可执行文件
add_executable(gtsam_check main.cpp)# 链接GTSAM库
target_link_libraries(gtsam_check gtsam)
有条件的同学,可以再好好看一下CMake的基础,后面的安装过程大概率还会用的到。
CMake 基础
main.cpp
#include <gtsam/geometry/Pose3.h>
int main() {gtsam::Pose3 pose;return 0;
}
编译命令:
cmake .
make
就会生成一个名为 gtsam_check 的可执行文件。
执行一下,如果不报错,就说明gtsam安装成功了。
如果报错了,看看报的是什么错。
我当时报的是这个错,找不到库文件 libmetis-gtsam.so 的路径:
./gtsam_check: error while loading shared libraries: libmetis-gtsam.so: cannot open shared object file: No such file or directory
这个错的解决方法,就在前面的配置环境变量的章节。