您好,欢迎来到爱站旅游。
搜索
您的当前位置:首页Cmake管理统一版本的SLAM第三方库

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、管理工程结构

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:

搜索usr/local/lib文件下opencv相关的全部库

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- azee.cn 版权所有 赣ICP备2024042794号-5

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务