《视觉SLAM十四讲精品总结》1:使用CMake和库文件

1、简单的cmake 使用

《视觉SLAM十四讲精品总结》1:使用CMake和库文件

CMakeLists.txt文件告诉cmake我们要对这个目录下的文件做什么事情。

    # 声明要求的 cmake 最低版本
    cmake_minimum_required( VERSION 2.8 )
     
    # 声明一个 cmake 工程
    project( HelloSLAM )
     
    # 添加一个可执行程序
    # 语法:add_executable( 程序名 源代码文件 )
    add_executable( helloSLAM helloSLAM.cpp )
 

2、使用库

程序由源文件和头文件组成。

可执行程序想调用库函数中的函数,需要在CMakeLists.txt中把可执行程序链接到库文件中

  1. # 将库文件链接到可执行程序上

  2. target_link_libraries( useHello hello_shared )《视觉SLAM十四讲精品总结》1:使用CMake和库文件

  3. 1、源文件useHello.cpp

        //头文件
        #include "libHelloSLAM.h"
         
         
        int main( int argc, char** argv )
        {
           // 使用头文件中的 printHello() 函数
            printHello();
            return 0;
        }

    2、头文件libHelloSLAM.h

    头文件说明库文件中有哪些函数。

        // 上面的宏定义是为了防止重复引用这个头文件而引起的重定义错误
        #ifndef LIBHELLOSLAM_H_
        #define LIBHELLOSLAM_H_
        //声明函数
        void printHello();
         
        #endif

    库的生成

    库文件源代码

        //库文件void而不是main
        #include <iostream>
        using namespace std;
         
        void printHello()
        {
            cout<<"Hello SLAM"<<endl;
        }

    CMakeLists.txt添加一句

        # 共享库
        add_library( hello_shared SHARED libHelloSLAM.cpp )

    3、CMakeLists.txt

        # 声明要求的 cmake 最低版本
        cmake_minimum_required( VERSION 2.8 )
         
        # 声明一个 cmake 工程
        project( HelloSLAM )
         
        # 添加一个共享库
        add_library( hello_shared SHARED libHelloSLAM.cpp )
        # 可执行程序
        add_executable( useHello useHello.cpp )
        # 将上述两者add_library和add_executable连接起来
        # 生成的库文件链接到可执行程序上
        target_link_libraries( useHello hello_shared )

     
    3、其他的大型库的CMakeLists.txt

    Eigen线性代数库

    Eigen是一个纯用头文件搭建起来的库,在使用时只需要在CMakeLists.txt中引用Eigen的头文件即可,不需要链接库文件。

        #添加头文件
        include_directories("/usr/include/eigen3")

    Sophus李代数库

    添加Sophus库的头文件和库文件

         
        find_package( Sophus REQUIRED )           #为了使用Sophus,需要使用find_package命令
        include_directories( ${Sophus_INCLUDE_DIRS}) #添加头文件目录
         
        add_executable( useSophus useSophus.cpp) #添加可执行文件
        target_link_libraries( useSophus ${Sophus_LIBRARIES} ) #添加库文件目录

    OpenCV

        find_package( OpenCV REQUIRED )                            #寻找OpenCV库
        include_directories( ${OpenCV_INCLUDE_DIRS}) #添加头文件
         
        add_executable( imageBasics imageBasics.cpp) #添加可执行文件
        target_link_libraries( imageBasics ${OpenCV_LIBS} )      #链接OpenCV库

    PCL点云库

        find_package( PCL REQUIRED COMPOMENT common io )
        include_directories( ${PCL_INCLUDE_DIRS})    #添加头文件目录
         
        add_executable( joinMap joinMap.cpp)     #添加可执行文件
        target_link_libraries( joinMap ${PCL_LIBRARIES} )      #添加库文件目录

    Ceres非线性优化库

        list( APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake_modules )
        find_package( Ceres REQUIRED )
        include_directories( ${CERES_INCLUDE_DIRS})         #添加头文件目录
         
        add_executable( curve_fitting main.cpp )         #添加可执行文件
        target_link_libraries( curve_fitting ${CERES_LIBRARIES} )      #添加库文件目录

    G2O图优化库

        # 添加g2o的依赖
        # 因为g2o不是常用库,要添加它的findg2o.cmake文件
        LIST( APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake_modules )
        SET( G2O_ROOT /usr/local/include/g2o )
        FIND_PACKAGE( G2O )
         
        include_directories( ${G2O_INCLUDE_DIRS} )            #添加头文件目录
        add_executable( curve_fitting main.cpp )          #添加可执行文件
        target_link_libraries( curve_fitting g2o_core g2o_stuff )       #添加库文件目录