linux:编译、使用共享库Sophus

编译、使用共享库


在学习SLAM过程中需要用到Sophus库来计算李群李代数这些。

下文将描述如何从github下载该库并且使用该库

一、下载和验证(书中要求使用非模板类的Sophus库)

git clone https://github.com/strasdat/Sophus.git
cd Sophus
git checkout a621ff

二、编译 

mkdir built
cmake ..
make

三、安装(这一步可选,如果安装,那么后面的操作要方便一些)

sudo make install

安装完后会输出如下:

  • 实际上就是将头文件放到系统的include目录下,把库文件放到系统的lib目录下

 四、配置include环境变量(没有执行上一步的安装操作的需要这一步)

在.bashrc 或者 .zshrc 文件末尾加上 Sophus的头文件目录

添加内容如下: 

#头文件目录 (路径自行更换)
CPLUS_INCLUDE_PATH=/home/msi/SLAM/Sophus:$CPLUS_INCLUDE_PATH
export CPLUS_INCLUDE_PATH 

五、配置动态库环境变量(这个配置是运行可执行文件时所需,不是编译时的)

如果这一步没有配置,运行可执行文件时会出现如下:

在.bashrc 或者 .zshrc 文件末尾加上编译Sophus时生成.so文件的目录

添加内容如下:

#找到动态链接库的路径
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/msi/SLAM/Sophus/build
export LD_LIBRARY_PAT

六、编译可执行文件

假如我们有这样一个.cpp文件,现在需要编译成可执行文件

#include<iostream>
using namespace std;
#include<math.h>
#include<eigen3/Eigen/Core>
#include<eigen3/Eigen/Geometry>

#include"sophus/so3.h"
#include"sophus/se3.h"

int main(int argc,char **argv)
{
    //沿z轴旋转90度的旋转矩阵
    Eigen::Matrix3d R=Eigen::AngleAxisd(M_PI/2,Eigen::Vector3d(0,0,1)).toRotationMatrix();
    
    //SO(3)构造方法1:直接从旋转矩阵构造
    Sophus::SO3 SO3_R(R);
    //SO(3)构造方法2:从旋转向量构造
    Sophus::SO3 SO3_v(0,0,M_PI/2);
    //SO(3)构造方法3:从四元数构造
    Eigen::Quaterniond q(R);
    Sophus::SO3 SO3_q(q);
    //输出时,以李代数so(3)形式输出的
    cout<<"SO3 from matrix"<<SO3_R<<endl;
    cout<<"SO3 from vetor:"<<SO3_v<<endl;
    cout<<"SO3 from quaternion:"<<SO3_q<<endl;
}

方法一:执行如下命令编译(这个是针对执行了第三步安装操作才这样用的):

g++ Sophus.cpp -lSophus -o Sophus

方法二:执行如下命令编译(这个是针对没有进行第三步安装操作的)(路径需要改为第二步编译出来的.so所在目录):

g++ Sophus.cpp  -L /home/msi/SLAM/Sophus/build/ -lSophus -o Sophus

方法三:编写CMakeLists.txt

  • 这个就有点玄妙了,自动寻找Sophus库路径,然后生成两个变量,进行编译和链接
  • 编译出来的程序可直接运行而不依赖第五步
cmake_minimum_required(VERSION 2.8)
find_package(Sophus REQUIRED)
message(STATUS ${Sophus_LIBRARIES})
include_directories(${Sophus_INCLUDE_DIRS})

add_executable(Sophus Sophus.cpp)
target_link_libraries(Sophus ${Sophus_LIBRARIES})

六、关于使用vim,ycm下自动补全,则需在ycm目录下的.ycm_extra_conf.py 中加上Sophus的头文件目录

猜你喜欢

转载自blog.csdn.net/dieju8330/article/details/85231606