一次解决cmake文件编写的烦恼(SLAM编写例程)

一、CMake资料收集

文章目录

      • 一、CMake资料收集
      • 二、语法
        • 1、基本语法
        • 2、单目录多源文件的编译
        • 3、多目录程序的编译
          • 1)、整个项目仅编写单个CMakeLists.txt
          • 2)、每个目录均编写一个CMakeLists.txt
          • 3)多文件实例
        • 4 slam中常用库的cmake文件编写
        • 5 常用库的问题(SLAM常用库)
          • 5.1 opencv的安装
          • 5.2 ceres的安装
          • 5.3 g2o的安装
      • 三、安装备注

  • https://blog.51cto.com/9291927/2115399

二、语法

1、基本语法

cmake_minimum_required(VERSION 3.12)
project(algorithm)
set(CMAKE_CXX_STANDARD 14)
add_executable(algorithm main.cpp)

上面是clion新建一个项目只有一个main.c时自动生成的CMakeLists.txt里的内容。

project指令:

定义工程的名称并可指定工程支持的语言,语言可省略,默认支持所有的语言。

project(project_name [code_lanaguage] )

set指令:

可以用来显式的定义变量。

上面的意思是CMAKE_CXX_STANDARD = 14;

set(VAR `[VALUE][CACHE TYPE DOCSTRING [FORCE]]`)

比如我们用到的是 SET(SRC_LIST main.c),如果有多个源文件,也可以定义成:

SET(SRC_LIST main.c t1.c t2.c)

2、单目录多源文件的编译

假如你的项目中只有下面4个源文件main.cpp、mod.hpp、mod_func1.cpp、mod_func2.cpp。因为cmake可以很轻松地解析出各文件的依赖关系,因此CMakeLists.txt其实十分简单:

cmake_minimum_required(VERSION 2.8)
add_executable(Main
  main.cpp
  mod_func1.cpp
  mod_func2.cpp
)

3、多目录程序的编译

假如你的项目的文件结构如下:

项目名/
  main.cpp
  mod1.hpp
  mod1/
    func1.cpp
    func2.cpp
  mod2.hpp
  mod2/
    func1.cpp
    func2.cpp

一般有以下两种方法:

1)、整个项目仅编写单个CMakeLists.txt

在项目的根目录下编写CMakeLists.txt:

cmake_minimum_required(VERSION 2.8)
add_executable(Main
  main.cpp
  mod1/func1.cpp
  mod1/func2.cpp
  mod2/func1.cpp
  mod2/func2.cpp
)
2)、每个目录均编写一个CMakeLists.txt

推荐使用这种方法,虽然它看似要编写的代码会增多,但由于更加模块化,管理起来会更加轻松。

#CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
add_subdirectory(mod1) 
add_subdirectory(mod2) 
add_executable(Main main.cpp)
target_link_libraries(Main Mod1 Mod2) 
#mod1/CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
add_library(Mod1 STATIC
  func1.cpp
  func2.cpp
)
#mod2/CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
add_library(Mod2 STATIC
  func1.cpp
  func2.cpp
)
3)多文件实例

主文件夹下:

cmake_minimum_required( VERSION 2.8 )
project ( myslam )

set( CMAKE_CXX_COMPILER "g++" )
set( CMAKE_BUILD_TYPE "Release" )
set( CMAKE_CXX_FLAGS "-std=c++11 -march=native -O3" )
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

list( APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake_modules )
set( EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin )
set( LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib )

############### dependencies ######################
# Eigen 包含头文件
include_directories("/usr/local/Cellar/eigen/3.3.7/include/eigen3")
# OpenCV
find_package( OpenCV 3.1 REQUIRED )
include_directories( ${OpenCV_INCLUDE_DIRS} )
# Sophus 
find_package( Sophus REQUIRED )
include_directories( ${Sophus_INCLUDE_DIRS} )
# G2O
find_package( G2O REQUIRED )
include_directories( ${G2O_INCLUDE_DIRS} )

set( THIRD_PARTY_LIBS 
    ${OpenCV_LIBS}
    ${Sophus_LIBRARIES}
    g2o_core g2o_stuff g2o_types_sba
)
############### source and test ######################
include_directories( ${PROJECT_SOURCE_DIR}/include )
add_subdirectory( src )
add_subdirectory( test )

test文件夹:

add_executable( run_vo run_vo.cpp )
target_link_libraries( run_vo myslam )

src文件夹下:

add_library( myslam SHARED
    frame.cpp
    mappoint.cpp
)

target_link_libraries( myslam
    ${THIRD_PARTY_LIBS}
)

4 slam中常用库的cmake文件编写

下面是ROS下面的cmake编写

# 主要分成六个步骤,非常直观
# 1.指定版本
cmake_minimum_required(VERSION 2.8.3)
# 2.指定项目
project(VIEKFSLAM2)
# 3.找到对应的包 opencv或者eigen3
find_package(Eigen3 REQUIRED)
find_package(OpenCV REQUIRED)
# 4.包含头文件所在的文件夹
include_directories(
  include
  ${catkin_INCLUDE_DIRS}
  ${EIGEN3_INCLUDE_DIR}
  ${OpenCV_INCLUDE_DIRS}
)
# 5.生成可执行程序
add_executable(vi_ekfslam_node src/vi_ekfslam_node.cpp src/vi_ekfslam.cpp)
# 6.将链接库链接到可执行程序中
target_link_libraries(vi_ekfslam_node 
                      ${catkin_LIBRARIES} 
                      ${OpenCV_LIBRARIES})

正常的cmake文件如下: 主要分成六个部分

# 1.指定版本
cmake_minimum_required( VERSION 2.8 )
# 2.指定项目
project( imageBasics )
# 添加c++ 11标准支持
set( CMAKE_CXX_FLAGS "-std=c++11" )
# 3.找到对应的包 opencv或者eigen3
find_package( OpenCV REQUIRED )
# 4.包含头文件所在的文件夹
include_directories( ${OpenCV_INCLUDE_DIRS} )
# 5.生成可执行程序
add_executable( imageBasics imageBasics.cpp )
# 6.将链接库链接到可执行程序中
target_link_libraries( imageBasics ${OpenCV_LIBS} )

小觅相机:

find_package(mynteye REQUIRED)
message(STATUS "Found mynteye: ${mynteye_VERSION}")
target_link_libraries( run_mynt 
												mynteye  )

5 常用库的问题(SLAM常用库)

5.1 opencv的安装
  • openCV的下载

  • 这里介绍了opencv的安装过程。

  • openCV 在cmake过程中需要提前下载的,然后放到对应文件夹中,不然在直接下载很容易失败。

查看opencv的版本`pkg-config opencv --modversion `
缺少依赖项:`sudo apt-get install libglew-dev glew-utils`
  • 这是opencv安装和卸载。查看OPENCV的版本号与其他信息。查看linux下opencv的版本:
pkg-config opencv --modversion
5.2 ceres的安装

安装完成后,在/usr/local/include/ceres 下找到 Ceres 的头文件,并 在/usr/local/lib/下找到名为 libceres.a 的库文件。有了头文件和库文件,就可以使用 Ceres 进行优化计算了。

另外,安装日志libgoogle-glog-dev libgtest-dev,安装依赖项目:

sudo apt-get install liblpack-dev libsuitesparse-dev libcxsparse3.1.4 libgflags-dev
5.3 g2o的安装
sudo apt-get install cmake libeigen3-dev libsuitesparse-dev libqt4-dev qt4-qmake libqglviewer-dev
  • 然后再运行g2o(编译),卸载g2ohttps://blog.csdn.net/HelloJinYe/article/details/100827753

  • fatal error: cs.h: 没有那个文件或目录

    include_directories("/usr/local/include/g2o/EXTERNAL/csparse")
    
  • 报错:fatal error: cs.h: No such file or directory

  • 参考:https://blog.csdn.net/weixin_44436677/article/details/106095485?fps=1&locationNum=2

三、安装备注

  • ubuntu的版本对应着不同的包,所以要使用Ubuntu Packages Search,在官网进行查包。
  • 如何创造可执行文件build.sh?
$echo 'sudo apt-get update' >> build.sh    #向build.sh文件写入内容
$chmod +x build.sh    #生成可执行程序
$./build.sh    #执行可执行程序
$nano build.sh    #编辑

你可能感兴趣的:(一次解决cmake文件编写的烦恼(SLAM编写例程))