Linux下cmake編譯流程實踐--添加外部庫(Sophus)

注:本文基於視覺SLAM中的歷程進行實踐操作,在上一篇(Linux下cmake編譯流程實踐–初學篇)完成了外部庫Sophus的引用。Sophus庫是Eigen庫的擴展,可以完成李代數,李羣的操作。
首先從gitee上下載代碼包 https://gitee.com/gchasing/sophus.git,我這邊從https://gitee.com/gchasing/slambook.git下載。後者爲高翔視覺SLAM教材對應的所有代碼包。下載解壓後如下圖所示:
在這裏插入圖片描述
在Sophus目錄下有CMakeLists.txt文件,所以建立對應的build文件夾,然後再

cmake ..
make

這個地方有個坑,源碼編譯報錯
在這裏插入圖片描述
解決方法是修改so2.cpp中的代碼如下

namespace Sophus
{

SO2::SO2()
{
  unit_complex_.real(1.);
  unit_complex_.imag(0.);
}

以下是操作步驟:

添加CMakeLists.txt文件如下:

find_package(Sophus REQUIRED )
message("Sophus dir ${Sophus_INCLUDE_DIRS}")
message("Sophus lib ${Sophus_LIBRARIES}")
add_executable(useSophus useSophus.cpp)
include_directories(${Sophus_INCLUDE_DIRS})
target_link_libraries(useSophus ${Sophus_LIBRARIES})

其中find_package表示查找Sophus的庫文件,隨後通過message打印到終端上進行查看。include_directoriestarget_link_libraries表示添加頭文件。useSophus.cpp文件如下:

#include <iostream>
#include <cmath>
using namespace std;

#include <eigen3/Eigen/Core>
#include <eigen3/Eigen/Geometry>

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

int main(int argc, char** argv)
{
    Eigen::Matrix3d R = Eigen::AngleAxisd(M_PI/2,Eigen::Vector3d(0,0,1)).toRotationMatrix();
    Sophus::SO3 SO3_R(R);
    cout<<"SO3_R="<<SO3_R<<endl;
    Sophus::SO3 SO3_V(0,0,M_PI/2);
    cout<<"SO3_V="<<SO3_V<<endl;
}

此處在源文件cpp中由於存在外部鏈接庫,所以採用#include "sophus/so3.h" 的形式。但是VSCode並未查找到外部庫文件,所以下面的程序無法自動補齊。

添加VScode外部庫鏈接

在vscode中使用ctrl+shift+P,然後輸入edit,找到 C/C++:edit configurations(JSON)
在這裏插入圖片描述
修改其中的includePath選項,由於源代碼中添加的是"sophus/so3.h",我們需要找到對應的so3和se3頭文件所在位置。如下圖所示:在這裏插入圖片描述
所以,添加頭文件路徑爲"/home/chasing/slambook/3rdparty/Sophus/sophus",然後保存關閉VScode,再次打開就可以發現已經關聯找到對應的頭文件了。
在這裏插入圖片描述

代碼運行效果

至此,就可以採用VScode的自動補齊功能完成代碼的編寫和編譯了,在此不再贅述。最後運行結果如下圖:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章