RGBD-SLAM学习1

版权声明:学习记录~ https://blog.csdn.net/robinhjwy/article/details/79186458

看高博的RGB-D SLAM博客,感觉有收获的地方,写下来。博客链接在此:
http://www.cnblogs.com/gaoxiang12/p/4633316.html

Linux下的CMake项目通常由几个文件夹组成。例如建一个创建一个名为RGBD-SLAM的文件夹(注意:此文件夹就是你代码的根目录了!)。然后往里面建几个子文件夹:
  bin 用来放编译好的可执行二进制文件。
  src 用来放源代码。
  lib 用来放编译好的库文件。
  include 用来放头文件。
当然,CMake工程肯定少不了CMakeLists.txt文件,所以,先创建一个空的CMakeLists.txt放在那里(终端中敲touch CMakeLists.txt可以创建,也可以UI界面创建。),完成后,工程的基本目录结构是这样的:
基本工程目录结构

第一步肯定是书写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、前三句设定不用说,跟固定搭配似的,基本每个根目录的CMakeLists.txt都要有,三个基本设定:版本、工程名称、编译器
2、我们建立的这几个分立的文件夹,本身其实是没有任何联系的,要想产生联系(变成有关系分工的一个工程),就是通过CMakeLists.txt创建联系的。
首先,可执行文件和库文件是一个并列的两种编译后输出的文件,所以设定下这两种文件输出到哪里吧:

#设定生成的可执行二进制文件的输出目录
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)

3、最后一句增加子文件夹有点跳转执行的意思,在子文件夹中还会有CMakeLists.txt,跳至子文件夹中的CMakeLists.txt继续构建。

#增加子文件夹,也就是进入源代码文件夹继续构建
ADD_SUBDIRECTORY( ${PROJECT_SOURCE_DIR}/src)

书写完了后,写个小程序测试一下:
首先,在src文件夹中写个最简单的程序main.cpp:

#include <iostream>

int main(int argc, char**argv)
{
    std::cout<<"Hello SLAM!"<<std::endl;
    return 0;
}

写完了就能编译链接运行了麽?并不是,因为这个源代码此时跟我们要创建的工程有任何一点关联。还是CMakeLists.txt。上文中提到的,跳至src子文件夹中继续构建,所以在src中还需要有一个CMakeLists.txt(Cmake实践中说,需要为任何子目录建立一个 CMakeLists.txt。这里的子目录也就是在上层CMakeLists.txt中添加的子目录,而不是指工程中任何一个子目录,比如承接库文件和可执行文件的bin和lib文件夹中就没有)。
src中的CMakeLists.txt就只写一下src文件夹中的文件关联和处理就好了,很简单,就是生成一个可执行文件:

#增加一个可执行的二进制
ADD_EXECUTABLE( main main.cpp )

OK ,至此我们写好了所有CMakeLists.txt和源代码,编译链接运行应该是没有问题的:
进入RGBD-SLAM根目录:

1 mkdir build
2 cd build
3 cmake ..
4 make

一顿操作猛如虎,一看排量1.5。。。
搞定后我们看看文件结构:
这里写图片描述
src中的main.cpp和CMakeLists.txt是我们写的。唯一多的就是在bin中输出了一个main可执行程序。build文件夹不多说,编译中产生的中间文件都堆在里面。结果也可以发现我们根目录中的CMakeLists.txt设定的,让可执行文件进bin文件夹是管用的。

总结两点就是
1、每级文件夹中的CMakeLists.txt主要负责对所在文件夹中的文件或文件夹进行操作,比如根目录RGBD-SLAM中的,串联各个目录,设定输出位置和头文件引用目录等工作。src中的CMakeLists.txt就只操作src中的main.cpp,用其添加一个可执行文件。
2、上级CMakeLists.txt添加的子目录,子目录中必须要有CMakeLists.txt!

猜你喜欢

转载自blog.csdn.net/robinhjwy/article/details/79186458
今日推荐