学习SLAM的过程中,都需要安装eigen、opencv等多种第三方库,而这些库往往对应不同版本,有时还会涉及多个版本之间的切换,但SLAM算法在终端树莓派或工控机部署时得重新安装第三方库。 本文使用Cmake管理多个第三方库,可实现多种第三方库的切换并且方便移植。
1、所管理第三方库版本
第三方库名称:
1> ceres ==> 1.14.0
2> eigen ==> 3.3.5
3> g2o ==> ??
4> opencv ==> 3.4.0
5> pangolin ==> 0.5.0
6> sophus ==> 1.0.0
第三方库需要的系统依赖:
1> atlas ==> 3.10.2
2> blas ==> 3.6.0
3> gflags ==> 2.1.2
4> glog ==> 0.3.4
5> lapack ==> 3.6.0
6> suitesparse ==> 4.4.6
7> gtest ==> 1.7.0
2、管理工程结构
test_lib为工程目录,下边两个子目录分别为slam_library(各个库安装的头文件和所依赖的库,system文件夹下为各种库的依赖项),test_3rdparty(测试库相关程序,与视觉SLAM十四讲一样)
3、CMakeList文件介绍
项目工程中共有三个CMakeList文件:
第一个是slam_library/slam_library.cmake,主要内容如下:
导入第三方库文件:
#第三方库文件夹
set(THIRD_PARTY_DIR ${CMAKE_CURRENT_LIST_DIR}/3rdparty)
set(SLAM_LIBS)
设置第三方库名称:
set(SLAM_ceres ${THIRD_PARTY_DIR}/ceres-1.14.0)
set(SLAM_eigen ${THIRD_PARTY_DIR}/eigen-3.3.5)
set(SLAM_opencv ${THIRD_PARTY_DIR}/opencv-3.4.0)
set(SLAM_pangolin ${THIRD_PARTY_DIR}/pangolin-0.5.0)
初始化宏:
macro(init)
if(BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release)
else(BUILD_TYPE)
set(CMAKE_BUILD_TYPE Debug)
endif(BUILD_TYPE)
add_compile_options(-std=c++11)
add_definitions(-DCOMPILEDWITHC11)
add_definitions(-DEIGEN_DONT_VECTORIZE -DEIGEN_DISABLE_UNALIGNED_ARRAY_ASSERT)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -O3 -fPIC -Wextra -std=c++17 -rdynamic -w")
set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS}")
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -s")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -s")
### 设置OUTPUT路径
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/Release/bin/${CMAKE_SYSTEM_PROCESSOR})
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/Release/lib/${CMAKE_SYSTEM_PROCESSOR}/${PROJECT_NAME})
set(INCLUDE_INSTALL_PATH ${PROJECT_SOURCE_DIR}/Release/include/${PROJECT_NAME})
endmacro()
将每个第三方库都定义为一个宏,方便随后调用:
#IMPORT MACROS
macro(SLAM_IMPORT ARG1)
include_directories(${ARG1}/include)
link_directories(${ARG1}/lib)
endmacro()
#google
macro(slam_import_glog)
SLAM_IMPORT(${SLAM_glog})
SLAM_IMPORT(${SLAM_gflags})
set(Google_LIBS glog gflags)
endmacro()
第二个是test_3rdparty/CMakeLists.txt,主要内容如下:
将第一个CMake文件导入(注意路径):
include(${PROJECT_SOURCE_DIR}/../slam_library/slam_library.cmake)
将第一个CMake文件中各个第三方库的宏导入:
init()
slam_import_eigen()
slam_import_opencv()
slam_import_ceres()
slam_import_pangolin()
slam_import_g2o()
slam_import_sophus()
添加子文件:
add_subdirectory(app)
第三个是test_3rdparty/app/CMakeLists.txt,主要内容如下:
add_executable(test_eigen test_eigen.cpp)
add_executable(test_opencv test_opencv.cpp)
target_link_libraries(test_opencv ${OpenCV_LIBS})
add_executable(test_ceres test_ceres.cpp)
target_link_libraries(test_ceres ${SLAM_LIBS} ${OpenCV_LIBS})
add_executable(test_pangolin test_pangolin.cpp)
target_link_libraries(test_pangolin ${Pangolin_LIBS})
add_executable(test_g2o test_g2o.cpp)
target_link_libraries(test_g2o ${G2O_LIBS} ${OpenCV_LIBS})
add_executable(test_sophus test_sophus.cpp)
target_link_libraries(test_sophus)
4、制作可移植性第三方库
在平时的第三方库编译安装的常用方法是使用cmake进行安装,安装结束后会显示其在系统中的位置,比如安装opencv:
接下来找到opencv安装位置对应的include文件夹和lib依赖库文件:
搜索usr/local/lib文件下opencv相关的全部库
将以上include头文件和lib库文件复制到/test_lib/slam_library/3rdparty/opencv-3.4.0下:
至此opencv-3.4.0的可移动库就做好了,类似可以制作其他库,对于第三方库使用需要的依赖库可以使用类似的方式,可使用dpkg -S XXX(依赖库名字)
命令进行搜索头文件和对应的lib库
5、本文使用的第三方库和工程文件地址
工程文件(可直接编译)
本文使用的第三方库