Cmake管理统一版本的SLAM第三方库

学习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、管理工程结构
Cmake管理统一版本的SLAM第三方库_第1张图片
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:
Cmake管理统一版本的SLAM第三方库_第2张图片
接下来找到opencv安装位置对应的include文件夹和lib依赖库文件
Cmake管理统一版本的SLAM第三方库_第3张图片

搜索usr/local/lib文件下opencv相关的全部库
Cmake管理统一版本的SLAM第三方库_第4张图片
将以上include头文件和lib库文件复制到/test_lib/slam_library/3rdparty/opencv-3.4.0下:
Cmake管理统一版本的SLAM第三方库_第5张图片Cmake管理统一版本的SLAM第三方库_第6张图片
Cmake管理统一版本的SLAM第三方库_第7张图片
至此opencv-3.4.0的可移动库就做好了,类似可以制作其他库,对于第三方库使用需要的依赖库可以使用类似的方式,可使用dpkg -S XXX(依赖库名字)命令进行搜索头文件和对应的lib库

5、本文使用的第三方库和工程文件地址
工程文件(可直接编译)
本文使用的第三方库

你可能感兴趣的:(SLAM库,linux,计算机视觉,opencv)