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

一、CMake资料收集

  • 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

三、安装备注

$echo 'sudo apt-get update' >> build.sh    #向build.sh文件写入内容
$chmod +x build.sh    #生成可执行程序
$./build.sh    #执行可执行程序
$nano build.sh    #编辑
CLion是一款由JetBrains开发的集成开发环境(IDE),专门用于C和C++的开发。它提供了丰富的功能和工具,可以帮助开发者更高效地编写、调试和测试代码。 CMake是一个跨平台的构建工具,它可以自动生成用于不同编译器和操作系统的构建脚本。通过使用CMake,我们可以将项目的构建过程与具体的编译器和操作系统解耦,从而实现跨平台的构建。 在CLion中编写JNI(Java Native Interface)可执行文件,需要进行以下步骤: 1. 创建一个新的CMake项目:在CLion中选择"File" -> "New Project",然后选择"C++ Executable"作为项目类型。 2. 配置CMakeLists.txt文件CMakeLists.txt是CMake的配置文件,用于指定项目的构建规则。你可以在该文件中添加JNI相关的配置。 例如,你可以使用`add_library`命令来创建一个动态链接库,并将JNI相关的源文件添加到该库中。示例代码如下: ``` cmake_minimum_required(VERSION 3.10) project(MyJNIProject) # 添加JNI相关的源文件 add_library(MyJNI SHARED jni_source_file.cpp) # 链接JNI库 target_link_libraries(MyJNI ${JAVA_JVM_LIBRARY}) ``` 在上述示例中,`jni_source_file.cpp`是包含JNI代码的源文件。`${JAVA_JVM_LIBRARY}`是一个变量,用于指定Java虚拟机的库文件。 3. 编写JNI代码:在CLion中创建一个新的C++源文件编写JNI相关的代码。JNI代码用于在Java和C/C++之间进行交互。 例如,你可以使用`JNIEnv`对象来调用Java方法,使用`jclass`对象来获取Java类的引用,使用`jmethodID`对象来表示Java方法的ID等。 4. 构建和运行项目:在CLion中点击"Build"按钮,CLion将自动执行CMake构建过程,并生成可执行文件。你可以通过点击"Run"按钮来运行生成的可执行文件。 以上是使用CLion和CMake编写JNI可执行文件的基本步骤。希望对你有所帮助!
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

擦擦擦大侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值