视觉SLAM十四讲-第四讲补充,运行例程代码错误解决trajectoryError.cpp:5:10: fatal error: sophus/se3.hpp: 没有那个文件或目录

博客讲述了在使用Sophus库时遇到的头文件缺失问题,通过检查和修改CMakeLists文件,成功解决了问题。作者首先确认安装的是带模板的Sophus库,并在主CMakeLists中添加了对Sophus的查找和链接。接着,发现example子目录的CMakeLists缺少对Sophus的引用,经过补充后,修复了编译错误。最后,提醒读者注意使用绝对路径处理cpp文件中的文件读取,并成功运行程序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Sophus安装补充

1. 我们使用高翔老师的github仓库中Sophus代码编译后即可(无需安装),看了一些书上的内容和一些博客,说是Sophus库分为模板库和非模板库。

我们按照github上下载的代码进行编译,那么安装的应该是带模板的Sophus。
参考文章fatal error: sophus/se3.h: 没有那个文件或目录
在这里插入图片描述
在这里插入图片描述

验证了我们Sophus是带模板的!!!
也就是说后续出现的问题,与我们安装的Sophus无关!!!

二、运行例程代码

1. 首先编辑CMakeLists文件(下面代码是补充后的)

cmake_minimum_required(VERSION 3.0)
project(useSophus)

# 为使用 sophus,需要使用find_package命令找到它
find_package(Sophus REQUIRED)

# Eigen
include_directories("/usr/include/eigen3")
include_directories(${Sophus_INCLUDE_DIRS})


add_executable(useSophus useSophus.cpp)
target_link_libraries(useSophus Sophus::Sophus)

add_subdirectory(example)

然后查看example中的CMakeList文件(未补充修改)

option(USE_UBUNTU_20 "Set to ON if you are using Ubuntu 20.04" OFF)
find_package(Pangolin REQUIRED)
if(USE_UBUNTU_20)
    message("You are using Ubuntu 20.04, fmt::fmt will be linked")
    find_package(fmt REQUIRED)
    set(FMT_LIBRARIES fmt::fmt)
endif()
include_directories(${Pangolin_INCLUDE_DIRS})
add_executable(trajectoryError trajectoryError.cpp)
target_link_libraries(trajectoryError ${Pangolin_LIBRARIES} ${FMT_LIBRARIES})

我们发现这个配置文件中缺少

find_package(Sophus REQUIRED)
include_directories(${Sophus_INCLUDE_DIRS})
target_link_libraries(useSophus Sophus::Sophus)

我们先不管这些,先修改补充第一个配置文件。现在进行编译

mkdir build && cd build
cmake ..
make

然后:
在这里插入图片描述
发现确少头文件,但是两个cpp代码中都引用了这个头文件,编译却发现只有这个缺少头文件,而且我们也安装了带模板的Sophus库。
因此我猜测可能是example中的CMakeList文件有问题
基于上文中两者的对比,我们修改后的配置文件如下图所示:

cmake_minimum_required(VERSION 3.0) #新加的
option(USE_UBUNTU_20 "Set to ON if you are using Ubuntu 20.04" OFF)

find_package(Pangolin REQUIRED)
find_package(Sophus REQUIRED) #新加的

if(USE_UBUNTU_20)
    message("You are using Ubuntu 20.04, fmt::fmt will be linked")
    find_package(fmt REQUIRED)
    set(FMT_LIBRARIES fmt::fmt)
endif()


include_directories(${Sophus_INCLUDE_DIRS}) #新加的
include_directories(${Pangolin_INCLUDE_DIRS}) 
add_executable(trajectoryError trajectoryError.cpp)
target_link_libraries(trajectoryError ${Pangolin_LIBRARIES} ${FMT_LIBRARIES})
target_link_libraries(trajectoryError Sophus::Sophus) #新加的

然后再次编译
**(建议将cpp文件中的读取文件的路径改为绝对路径)**或者

string groundtruth_file = "../../example/groundtruth.txt";
string estimated_file = "../../example/estimated.txt";

特别注意:
使用相对路径时,是以生成的可执行文件作为参考的,而不是以cpp文件

在这里插入图片描述
运行 ./T……
在这里插入图片描述
大功告成啦!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值