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_directories
和target_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的自动补齐功能完成代码的编写和编译了,在此不再赘述。最后运行结果如下图: