Linux下cmake编译流程实践--添加外部库(Sophus)

注:本文基于视觉SLAM中的历程进行实践操作,在上一篇(Linux下cmake编译流程实践–初学篇)完成了外部库Sophus的引用。Sophus库是Eigen库的扩展,可以完成李代数,李群的操作。
首先从gitee上下载代码包 https://gitee.com/gchasing/sophus.git,我这边从https://gitee.com/gchasing/slambook.git下载。后者为高翔视觉SLAM教材对应的所有代码包。下载解压后如下图所示:
Linux下cmake编译流程实践--添加外部库(Sophus)_第1张图片
在Sophus目录下有CMakeLists.txt文件,所以建立对应的build文件夹,然后再

cmake ..
make

这个地方有个坑,源码编译报错
Linux下cmake编译流程实践--添加外部库(Sophus)_第2张图片
解决方法是修改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 
#include 
using namespace std;

#include 
#include 

#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)
Linux下cmake编译流程实践--添加外部库(Sophus)_第3张图片
修改其中的includePath选项,由于源代码中添加的是"sophus/so3.h",我们需要找到对应的so3和se3头文件所在位置。如下图所示:Linux下cmake编译流程实践--添加外部库(Sophus)_第4张图片
所以,添加头文件路径为"/home/chasing/slambook/3rdparty/Sophus/sophus",然后保存关闭VScode,再次打开就可以发现已经关联找到对应的头文件了。
Linux下cmake编译流程实践--添加外部库(Sophus)_第5张图片

代码运行效果

至此,就可以采用VScode的自动补齐功能完成代码的编写和编译了,在此不再赘述。最后运行结果如下图:
Linux下cmake编译流程实践--添加外部库(Sophus)_第6张图片

你可能感兴趣的:(飞控周边,cmake,c++,linux)