RGBD-SLAM学习1
参考高博先生的RGB-D SLAM博客,在某些地方学到了不少知识。该文中的部分内容让我印象深刻,在代码实现方面也提供了很好的借鉴意义。如有兴趣的朋友可参考以下链接:http://www.cnblogs.com/gaoxiang12/p/4633316.html
在Linux环境下运行的CMake项目通常包含若干个目录结构。请注意,这个RGBD-SLAM目录实际上就是整个项目的根目录!接下来需要创建以下子目录:bin用于存放编译完成后可以直接运行的二进制程序;src存储着原始代码源文件;lib保存已编译完成的共享库文件;include存放包含头文件。然后,在这个位置创建一个新的CMakeLists.txt文件(使用终端命令touch CMakeLists.txt即可初始化它,或者通过图形界面工具进行创建)。项目的整体架构大致如下:

第一步肯定是书写CMakeLists.txt中的内容:
CMAKE_MINIMUM_REQUIRED( VERSION 2.8 ) #设定版本
PROJECT( slam ) #设定工程名
SET( CMAKE_CXX_COMPILER "g++") #设定编译器
#设定生成的可执行二进制文件的输出目录
SET( EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
#设定存放编译出来的库文件的输出目录
SET( LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
#并且把该目录设为连接目录
LINK_DIRECTORIES( ${PROJECT_SOURCE_DIR}/lib)
#设定头文件目录
INCLUDE_DIRECTORIES( ${PROJECT_SOURCE_DIR}/include)
#增加子文件夹,也就是进入源代码文件夹继续构建
ADD_SUBDIRECTORY( ${PROJECT_SOURCE_DIR}/src)
1、前三项设定无需赘述——类似于固定模式。
2、这几个独立设置的文件夹之间并无直接关联——除非借助CMakeLists.txt来建立相互关联。
3、这两个编译产物分别对应可执行程序与共享库——因此需要指定这两个 compile destinations:
- 第一个用于放置可执行程序
- 第二个则用于存放共享库
#设定生成的可执行二进制文件的输出目录
SET( EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
#设定存放编译出来的库文件的输出目录
SET( LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
#并且把该目录设为连接目录。由于库文件是用于链接的,所以同时设定为链接目录。
LINK_DIRECTORIES( ${PROJECT_SOURCE_DIR}/lib)
程序输出的文件设置了路径;同理,在哪儿找头文件?同样地进行设置。
#设定头文件目录
INCLUDE_DIRECTORIES( ${PROJECT_SOURCE_DIR}/include)
第三点,在最后一步中添加子文件夹时具有一定的逻辑引导作用。其中包含有CMakeLists.txt文件,并引导构建过程进入相应的构建目录以完成后续工作流程。
#增加子文件夹,也就是进入源代码文件夹继续构建
ADD_SUBDIRECTORY( ${PROJECT_SOURCE_DIR}/src)
编写完成后,请编写一个小程序用于测试
#include <iostream>
int main(int argc, char**argv)
{
std::cout<<"Hello SLAM!"<<std::endl;
return 0;
}
是否能够直接进行编译、链接并执行?实际上并不是如此,在当前工程的目标构建路径并无任何关联的情况下才需考虑这一问题。如前所述,在跳至位于上层目录下的src子文件夹进行后续构建操作之前,请确保该子目录下也存在一个完整的CMakeLists.txt配置文档(根据CMake实践,在任何子目录下都需要创建一个 CMakeLists.txt)。因此,在位于上层目录下的src子文件夹中创建一个新的CMakeLists.txt文件就足够了。通过该列表即可自动生成一个可执行程序:
#增加一个可执行的二进制
ADD_EXECUTABLE( main main.cpp )
OK ,至此我们成功编写并保存了完整的CMakeLists.txt文件以及相关的源代码配置文件:
进入RGBD-SLAM项目根目录:
编译、链接并运行这些步骤应该能够顺利完成。
1 mkdir build
2 cd build
3 cmake ..
4 make
一顿操作猛如虎,一看排量1.5。。。
搞定后我们看看文件结构:

我们开发了位于源代码目录中的两个关键文件:main.cpp和CMakeLists.txt。这些配置文件主要用于构建项目并指定编译目标。为了实现这一点,在构建过程中创建了一个名为build的目录用于存放编译产生的中间文件。通过这种方式将最终可执行程序放置于build/bin/目录中能够有效避免路径冲突问题。
总结两点就是 :
1、每级文件夹中的CMakeLists.txt主要负责对所在文件夹中的文件或文件夹进行操作,比如根目录RGBD-SLAM中的,串联各个目录,设定输出位置和头文件引用目录等工作。src中的CMakeLists.txt就只操作src中的main.cpp,用其添加一个可执行文件。
2、上级CMakeLists.txt添加的子目录,子目录中必须要有CMakeLists.txt!
