日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

eigen冲突 sophus 安装_SLAM-Sophus模板库安装总结

發布時間:2025/3/15 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 eigen冲突 sophus 安装_SLAM-Sophus模板库安装总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【問題】由于自己買的書《視覺SLAM十四講:從理論到實踐》,也就是《視覺SLAM十四講》的第二版,書中Sophus庫用的是模板版本,而之前我下載書籍代碼是第一版書籍的代碼倉庫,沒辦法,只能重新安裝Sophus庫(其實無論是模板庫還是非模板庫都是一樣,只不過在程序寫法上有些變化)。第二版書籍代碼倉庫中也有第三方的Sophus代碼包,但是在編譯安裝的時候,總是報錯。具體每一步報的錯誤,我忘記截屏了,只記得過程。

【結果】sophus庫安裝了兩個版本:模板庫和非模板庫。eigen庫安裝了兩個版本,一個是3.2.9的,一個是3.3.7的。

【模板類和非模板類的區別】

至于在使用上的差異,我就不多說了。只討論下在安裝過程中和使用配置上的差異。模板類的Sophus中可以使用不同精度的李群/李代數,而非模板類的Sophus只提供雙精度的李群/李代數。

git clone https://github.com/strasdat/Sophus.git // 首先下載代碼倉庫

cd Sophus

git checkout a621ff // 切換到對應的版本中去

// a621ff是非模板類的版本

// 00f3fd9是2018年的一個模板類的版本 //這是我安裝的版本

// git checkout master // 可以切換會最新的版本

// git log // 可以查看提交版本記錄

在非模板類中,庫是利用.c加.h的方式實現的;而在模板類庫中是集合在一個.hpp中實現的

1. 手動安裝Eigen-3.3.7庫

# 在書籍的第一版中,eigen的安裝十分簡單:

$ sudo apt-get install libeigen3-dev

# 但是默認安裝eigen版本是3.2.9版本的,這不滿足模板類的Sophus的安裝要求

進入Eigen的下載網址,右側正中有一個下載鏈接(Get it),這里選擇tar.gz.

eigen下載網站

我選擇的是Eigen 3.3.7版本的,懶得找了,就隨便下的這個最新版本。下載完之后,安裝過程十分簡單,因為eigen也是一個cmake項目

cd [ path-to-eigen ]

mkdir build

cd build

cmake ..

make

sudo make install

安裝的時候,我看了一下安裝位置。通過apt-get安裝的位置在/usr/include/,但是自己手動安裝的eigen3安裝在了/usr/locla/include/文件夾下,所以兩者并不存在沖突問題,但是在CMakeLists.txt文件使用find_package()查找庫一定要小心,所以如果要使用eigen庫的時候,建議在CMakeLists.txt文件中采用include_directories("/usr/local/include/eigen3")這條指令

2. 安裝模板庫版本的Sophus

# 安裝本身是十分簡單的

cd [ path-to-sophus ]

mkdir build

cd build

cmake ..

make

sudo make install

但是這樣的步驟會導致在/usr/local/include/sophus/中出現對應的兩組頭文件,同時會在/usr/local/lib中出現共享庫的覆蓋問題,即libSophus.so文件只能保存一個版本的共享庫文件,根據對模板庫和非模板庫文件的分析可知,模板庫只需要頭文件即可,而無需庫文件,也就是不需要target_link_libraries()。所以安裝的時候,需要先安裝模板類的Sophus,然后再安裝非模板類的Sophus

當然你也可以像我這樣做,同時保留模板類和非模板類的Sophus庫文件,只需要在編譯非模板類的時候,修改下Sophus文件下的CMakeLists.txt文件。

# 將第一行的Sophus替換為SophusNormal

SET(PROJECT_NAME Sophus)

# =====================================================

SET(PROJECT_NAME SophusNormal)

這種情況還是會產生新的問題,就編譯項目文件的時候,總是提示無法找到相關變量,未定義的引用

未定義引用

這個錯誤的原因是程序沒有在系統共享庫中找到libSophusNormal.so文件,可以通過如下操作更新系統共享庫索引目錄。

# 更新/etc/ld.so.cache文件(庫配置文件)

$ sudo ldconfig

3. CMakeLists.txt文件和main.cpp文件中的不同

CMakeLists.txt文件

# 非模板類庫,為了盡可能減少問題,盡量將環境配置完善

cmake_minimum_required( VERSION 2.8 )

project( useSophus )

set(CMAKE_CXX_STANDARD 11)

# 為使用 sophus,您需要使用find_package命令找到它

# include_directories( "/usr/local/include/sophus" )

find_package( Sophus REQUIRED )

include_directories( ${Sophus_INCLUDE_DIRS} )

add_executable( useSophus useSophus.cpp )

# 這里的target_link_libraries()至關重要

# 因函數只在頭文件中聲明了,卻沒有找到具體的函數內容,會導致編譯器報錯。因此需要將so包鏈接到項目中來

# 而根據書中第二章內容可知,target_link_libraries()是為了鏈接上對應的共享庫文件(路徑是“/usr/local/lib”)

target_link_libraries( useSophus SophusNormal )

cmake_minimum_required(VERSION 2.8)

project(useSophus)

set(CMAKE_CXX_STANDARD 11)

# 為使用 sophus,需要使用find_package命令找到它

find_package(Sophus REQUIRED)

include_directories(${Sophus_INCLUDE_DIRS})

add_executable(useSophus useSophus.cpp)

main.cpp文件

在非模板類的Sophus庫中,庫使用.c,.h,而在模板類的Sophus庫中是集合在一個.hpp中實現的

//引用非模板類庫

#include “sophus/so3.h”

#include “sophus/se3.h”

//引用模板類庫

#include “sophus/so3.hpp”

#include “sophus/se3.hpp”

參考資料

【0】Sophus代碼倉庫:開發Sophus這個庫的小哥哥酷酷的

【1】李群與李代數及Sophus的安裝使用:該博主安裝的sophus版本是非模板類的

【2】libXXX.so.X: cannot open shared object file: No such file:解決共享庫索引不到問題

【3】Sophus庫CMakeLists.txt內容詳解筆記:對CMakeLists.txt解析清晰

【4】Sopus庫中FindEigen3.cmake內容詳解筆記

【5】ubuntu16.04+eigen3安裝:這篇博客提示了幾個重要的文件路徑,至于文章中關于怎么安裝的操作可以忽視

【6】Sophus庫模板類的使用問題:闡述了模板類和非模板類的不同,特別是文件結構上的差異辨析

【7】Sophus-issues187:這里討論了libeigen3-dev的版本問題

總結

以上是生活随笔為你收集整理的eigen冲突 sophus 安装_SLAM-Sophus模板库安装总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。