视觉SLAM十四讲学习笔记(二)Cmake Practice

一、cmake构建helloworld

1、生成

在t1/main.c中写入

#include 

int main()
{
   printf("Hello World from t1 Main!\n");
   return 0;
}

在t1/CMakeLists.txt中写入

PROJECT(HELLO)
SET(SRC_LIST main.c)
MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR})
MESSAGE(STATUS "This is SOURCE dir " ${HELLO_SOURCE_DIR})
ADD_EXECUTABLE(hello ${SRC_LIST})

之后

视觉SLAM十四讲学习笔记(二)Cmake Practice_第1张图片

2、解释

PROJECT(projectname [CXX] [C] [Java])定义工程文件名以及支持的语言,隐式定义了两个变量_BINARY_DIR 和 _SOURCE_DIR,此处为内部编译,所以两个变量的路径都为/home/dongsheng/Code/CMakeLearning/t1.系统也帮助我们预定义了 PROJECT_BINARY_DIR 和 PROJECT_SOURCE_DIR变量,他们的值分别跟 HELLO_BINARY_DIR 与 HELLO_SOURCE_DIR 一致.

SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])  显示定义变量,也可以定义多个变量:SET(SRC_LIST main.c t1.c t2.c)

MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message to display"...)

SEND_ERROR,产生错误,生成过程被跳过

SATUS ,输出前缀为 — 的信息

FATAL_ERROR,立即终止所有 cmake 过程

ADD_EXECUTABLE(hello ${SRC_LIST}) 定义可执行文件hello, 相关源文件为SRC_LIST定义的源文件列表

3、语法

  1. 变量使用${}方式取值,但是在 IF 控制语句中是直接使用变量名

  2. 指令(参数 1 参数 2...)

  3. 指令是大小写无关的,参数和变量是大小写相关的。但,推荐你全部使用大写指令

4、内部构建和外部构建

首推使用build进行外部构建

通过外部编译进行工程构建,HELLO_SOURCE_DIR 仍然指代工程路径,即Code/CMakeLearning/t1.而 HELLO_BINARY_DIR 则指代编译路径,即Code/CMakeLearning/t1/build.


二、更好一点的helloworld

1、生成

目录树

t2

-----CMakeLists.txt

-----build

-----src

-----------CMakeLists.txt

-----------main.c

其中各个文件夹的内容分别是

视觉SLAM十四讲学习笔记(二)Cmake Practice_第2张图片

编译及运行

视觉SLAM十四讲学习笔记(二)Cmake Practice_第3张图片

2、解释

ADD_SUBDIRECTORY(source_dir [binary_dir] [EXCLUDE_FROM_ALL])用于向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制存放的位置。上面的例子定义了将 src 子目录加入工程,并指定编译输出(包含编译中间结果)路径为bin 目录。如果不进行bin 目录的指定,那么编译结果(包括中间结果)都将存放在build/src 目录(这个目录跟原有的 src 目录对应),指定 bin 目录后,相当于在编译时
将 src 重命名为 bin,所有的中间结果和目标二进制都将存放在 bin 目录。

3、换个地方保存目标二进制

指定最终的目标二进制的位置(指最终生成的 hello 或者最终的共享库,不包含编译生成的中间文件)

SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)

在哪里 ADD_EXECUTABLE 或 ADD_LIBRARY, 如果需要改变目标存放路径,就在哪里加入上述的定义.

4、安装

啊啊啊啊,太多了,需要用的时候直接看吧,先mark一下,之后再来写(copy)

你可能感兴趣的:(视觉SLAM十四讲)