LVI_SAM虚拟机安装复现(二)

news/2025/2/27 22:19:56/文章来源:https://www.cnblogs.com/luckydoog/p/18742108

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 手动添加到环境变量里。
环境变量在哪里改?

配置环境变量

如果库文件路径正确,但系统未正确识别,可以将库路径添加到环境变量中:

  1. ~/.bashrc 文件中添加以下内容:

    export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
    
  2. 重新加载配置:

    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;
}

编译命令:

  1. cmake .
  2. 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

这个错的解决方法,就在前面的配置环境变量的章节。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/890874.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

逆向软件设计—网上购书结账系统

一、作业要求找一个已有的项目(同学、高年级同学、网络下载),阅读分析,找出软件尚存的缺陷, 改进其软件做二次开发,并将这个过程整理成一份博客。 二、原项目介绍 本次课程设计我逆向开发的软件是一个使用c++编写的网上购书结账系统,原作者是22软工2班的熊知宇学长,学号…

学生管理系统二次开发与优化实践

在软件开发中,对现有项目进行优化和二次开发是一种常见的任务。本次实验中,我选择了一个基于C++开发的学生管理系统作为优化对象。该系统实现了学生信息的增删改查功能,并支持学号排序和模糊查找等功能。通过分析原项目,我发现了几个可以改进的地方,并对系统进行了优化。以…

逆向软件工程

一、来源 本次实验项目来源于c++课程设计:线上图书购买系统 二、运行环境及运行结果 运行环境:vs 2022 Windows 11 运行结果:代码展示: `#include include include "Order.h" include "Book.h" void displayMenu() { std::cout << "1. Ad…

基于MPPT最大功率跟踪的离网光伏发电系统Simulink建模与仿真

1.课题概述 基于MPPT最大功率跟踪的离网光伏发电系统Simulink建模与仿真。2.系统仿真结果 (完整程序运行后无水印)3.核心程序与模型 版本:MATLAB2022a4.系统原理简介基于最大功率点跟踪(Maximum Power Point Tracking, MPPT)的离网光伏发电系统是利用太阳光直接转换为电能…

[Black Watch 入群题]PWN(栈迁移)

先检查一下保护,32位的分析一下代码,发现buf距离ebp为0x18(24),但是read只溢出0x20(32),也就是只溢出8个字节,刚好覆盖到ret。 第一个read读取0x200到s(.bss段)两个write会打印m1和m2,点击m1,m2查看因为溢出不够,这时候我们可以考虑栈迁移expfrom pwn import * f…

WC Java 实现

一.来源 WC Java 实现(Pramy) https://www.cnblogs.com/pramy/p/9607743.html 二.运行环境及运行结果 运行环境:Visual Studio Code 运行结果截图:* 三.主要问题 1.异常处理不够详细: 在处理文件时,如果文件不存在或无法读取,程序会抛出异常,但没有提供详细的错误信息或…

docker实现的基本原理

Docker 实现容器的基本原理依赖于 Linux 内核的三大核心机制:命名空间(Namespaces)、控制组(cgroups) 和 联合文件系统(UnionFS),也是 Docker 能够出现的最重要原因。 1. 命名空间(Namespaces) 作用:实现资源的隔离,使容器内的进程无法感知或干扰宿主机的其他进程或…

将DeepSeek接入人类大脑会怎样??

昨天在与同事聊起最近大火的DeepSeek, 突然,有一个不切实际的想法,如果DeepSeek或人工智能AI能以某种形式接入人类大脑, 比如,通过芯片不侵入式连接大脑 或者 外带什么眼镜、 隐形眼镜之类的, 能人类有DeepSeek一样的知识量以及响应速度,那得多好,整个世界、人类将会变…

gh-ost工具介绍及使用

💖简介 gh-ost 是一款由GitHub开发的在线DDL(Online Data Definition Language)变更工具,专门用于MySQL数据库。它允许在不锁定表的情况下执行数据库模式变更,从而避免了传统ALTER TABLE命令可能带来的长时间锁表问题,这对于高可用性要求严格的生产环境尤为重要。 它通过…

[算法]KD树

KD树,你看着他好几个维度不明白,但实际上非常简单 \(K\)指维度 因此他可以在二维(多维)平面内进行搜索!!! 1.二维 1.1 建树 对于每一层,我们使用轮转法进行建树 什么意思呢?比如二维,如果\(x\)层为一维(横坐标),则\((x+1)\)层为二维(纵坐标) 确定好维数,接下来…

事务的ACID原则

atomic原子性,事务包含一批读写操作要么都提交,要不都回滚,在并发状态下另一个线程看到的这个线程操作的事务一定是完整的,要不都没看见,要么都看见,不存在看见一半的情况。 consiste一致性,对数字的一组特定的约束条件必须成立,例如转账业务中的进账和出账必须能相抵。…