linux:編譯、使用共享庫Sophus
阿新 • • 發佈:2018-12-24
編譯、使用共享庫
在學習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的標頭檔案目錄