cmake实践(1)--最基本的helloworld

最近找了一个《cmake practice》的电子书,以为写得比较清晰易懂,适合我这种noob,本随笔主要内容基于该电子书,所以会出现“过渡引用”的问题,主要目的是做为本身的学习笔记。git

另外英语比较好的能够直接去看Github,地址是https://github.com/Akagi201/learning-cmakegithub

我的以为,写cmake自己的技术要求,同掌握一门脚本语言至关,某种程度上可能难度还高一些。bash

废话少说,开始学习。学习

初识和安装就算了,这都解决不了那就无法玩了。测试

直接从基本编译文件开始。ui

先在主目录下建立一个测试的目录,例如个人主目录是/home/castor/,那就搞一个mycmake的文件夹,再搞一个t1的文件夹。spa

~$cd
~$mkdir -p mycmake/t1

接下来就是在这个文件夹下面建立两个文件了:3d

~$ cd mycmake/t1/
castor@xdvm:~/mycmake/t1$ touch main.c
castor@xdvm:~/mycmake/t1$ touch CMakeLists.txt

  而后main.c中是经典的helloworld代码,或者其余,这里直接复制文档中的代码:blog

#include <stdio.h>
int main()
{
	printf("Hello World from t1 Main!\n");
	return 0;
}

  固然这个不是重点,看看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})

  原文档第六页的代码有bug,最后一行SRC_LIST没有被$和花括号包起来。

构建和运行很简单:

~/mycmake/t1$ cmake .
~/mycmake/t1$ make

  执行后大概是这样的:

而后就能够经过./hello运行程序了。

解释一下:cmake .(注意后面的小句点),这个命令生成了不少文件,目前须要知道的是,以及重点是,生成了Makefile文件。而后make就是按这个Makefile生成可执行文件。

最重点的仍是CMakeLists文件了。

PROJECT定义了工程的名字

cmake 系统也帮助咱们预约义了 PROJECT_BINARY_DIR 和 PROJECT_SOURCE_DIR变量,他们的值分别跟 HELLO_BINARY_DIR 与 HELLO_SOURCE_DIR(这两个是隐式变量) 一致,若是项目名字变化,PROJECT_BINARY_DIR 和PROJECT_SOURCE_DIR可以自适应。

SET 指令的语法是:
SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])
现阶段,你只须要了解 SET 指令能够用来显式的定义变量便可。
好比咱们用到的是 SET(SRC_LIST main.c),若是有多个源文件,也能够定义成:
SET(SRC_LIST main.c t1.c t2.c)。

MESSAGE 指令的语法是:
MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message to display"...)
这个指令用于向终端输出用户定义的信息,包含了三种类型:
SEND_ERROR,产生错误,生成过程被跳过。
SATUS,输出前缀为--的信息,图中能够看到。
FATAL_ERROR,当即终止全部 cmake 过程。

若是不加这三种也是能够的,那就是一个普通的信息,有点相似echo了。

ADD_EXECUTABLE(hello ${SRC_LIST})

定义了这个工程会生成一个文件名为 hello 的可执行文件 ,这个SRC_LIST就是前面定义的一个变量。

虽然这里看起来有点画蛇添足,可是若是屡次出现的多个文件的话,就会发现这种方式很方便。

 

cmake中使用了${}来引用变量,这是 cmake 的变量引用方式,可是,有一些例外,好比在 IF 控制语句,变量是直接使用变量名引用,而不须要${},这个要当心。

 

基本语法规则

1. 变量使用${}方式取值,可是在 IF 控制语句中是直接使用变量名
2. 指令(参数 1 参数 2...) 参数使用括弧括起,参数之间使用空格或分号分开
3. 指令是大小写无关的,参数和变量是大小写相关的。 推荐所有使用大写指令
4. 后面学习到了再加上 

 

使用make clean 命令清除构建(感受用处不大)

 

刚才进行的是内部构建(in-source build),而 cmake 强烈推荐的是外部构建(out-of-source build)

外部编译的过程以下:
1,首先,请清除 t1 目录中除 main.c CmakeLists.txt 以外的全部中间文件,最关键的是 CMakeCache.txt
2,在 t1 目录中创建 build 目录,固然你也能够在任何地方创建 build 目录,不必定必须在工程目录中。
3,进入 build 目录,运行 cmake ..(注意,..表明父目录,由于父目录存在咱们须要的CMakeLists.txt,若是你在其余地方创建了 build 目录,须要运行 cmake <工程的全路径>),查看一下 build 目录,就会发现了生成了编译须要的 Makefile 以及其余的中间
文件.
4,运行 make 构建工程,就会在当前目录(build 目录)中得到目标文件 hello
上述过程就是所谓的 out-of-source 外部编译,一个最大的好处是,对于原有的工程没有任何影响,全部动做所有发生在编译目录。

使用外部构建之后,能够看到:

-- This is BINARY dir /home/castor/mycmake/t1/build
-- This is SOURCE dir /home/castor/mycmake/t1

binary和source在不一样的目录了

相关文章
相关标签/搜索