一、cmake的hello world

cmake学习我是参考了《CMake Practice.pdf》,说实话这本书写的真好,很详细,所以就按照这本书,自己再总结一遍。(其实是自己抄一遍,哈哈哈)
添加一下pdf的路径

1.1 初识cmake

我这里就不写了,就是一堆介绍,有兴趣的可以看看pdf。

1.2 安装cmake

我比较懒,直接用apt-get安装,省时方便。

1.3 初试cmake - cmake的helloworld

1.3.1 hello world

按照作者,创建一个main.c这是源代码文件,然后在创建CMakeLists.txt(这个应该叫作cmake语法文件,cmake就是根据这个生成makefile)。

下面是两个文件的清单:

// main.c
#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})

然后开始构建,cmake . (这里是有一个点的,表示构建当前目录)

构建的意思,根据cmake的语法,自动创建一个makefile,这时候我们就可以看到makefile了

然后接下来执行make

就可以看到我们需要的可执行文件了,然后直接执行即可。

1.3.2 CMakeLists.txt分析

# PROJECT (projName [CXX] [C] [Java]) 定义工程名称,并可指定工程支持的语言,支持的语言列表可以忽略
# 这个指令隐式的定义了两个cmake变量:<projName>_BINARY_DIR以及<projName>_SOURCE_DIR
# 同时cmake系统也帮组我们预定义了PROJECT_BINARY_DIR和PROJECT_SOURCE_DIR变量
# 这两个变量跟<projName>_BINARY_DIR和<projName>_SOURCE_DIR变量是一样的
# 以后选择经理用PROJECT_BINARY_DIR和PROJECT_SOURCE_DIR这个,换工程名也不会影响
PROJECT (HELLO)  

# SET (VAR [Value] [CACHE TYPE DOCSTRING [FORCE]])
# 目前我们使用SET指令来显式定义变量
# 我们现在是把main.c 定义成一个SRC_LIST变量
# 如果有多个文件来可以定义 SET(SRC_LIST "main.c" t1.c t2.c)
SET(SRC_LIST "main.c")

# MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message to display" ...)
# 这个指令用于向终端输出用户定义的信息,包含了三种类型:
# SEND_ERROR,产生错误,生成过程被跳过
# SATUS,输出前缀为-的信息
# FATAL_ERROR,立即终止所有cmake过程
# 我们下面定义的是往屏幕里输出,顺便看看这两个变量的值
MESSAGE(STATUS "This is Binary dir " ${HELLO_BINARY_DIR})
MESSAGE(STATUS "This is SOURCE dir " ${HELLO_SOURCE_DIR})

# 定义了这个工程会生成一个文件名为hello的可执行文件,相关的源文件是SRC_LIST中定义的源文件列表
# 这里使用变量需要用${},但是有一些例外,就是IF控制语句时,变量是直接使用变量名,而不需要${}
# 这里尽量使用变量,因为有可能上面的源文件列表会修改
ADD_EXECUTABLE(hello ${SRC_LIST})

比较喜欢在代码中写注释,这样记忆会很深刻

看看输出的:
在这里插入图片描述
看到倒数第4 5行就是我们添加的打印数据。

1.3.3 基本语法规则

上面 内容就是所谓的cmake语言和语法,最简单的语法规则是:

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

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

    参数使用括号括起,参数之间使用空格或分号分开

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

1.3.4 问题?问题!

cmake工程中是不支持make distclean这个指令的。

官方给出的解释:

因为CMakeLists.txt可以执行脚本并通过生成一些临时文件,但是却没有办法来跟踪这些临时文件到底是那些。因此,没有办法提供一个可靠的make distclean方案。

我们现在用的是内部构建,但是cmake强烈推荐外部构建(内部构建太乱了,并且不知道删除,如果在外部构建的话,直接删除一个目录,源代码是干净的)

1.3.5 外部编译

  1. 先把之前生成的文件删除,这个很容易删错,我就删错了
  2. 从新创建一个build文件夹
  3. 进入build目录,然后cmake … (这个…是指上一级目录,学到linux的都懂,如果在其他目录的话,要输入相对路径)
  4. 运行make构建工程,我们就在当前目录看到了目标文件hello

通过外部编译之后,在看源代码目录:

在这里插入图片描述

是不是很清爽,这种方式确实好,需要特别注意的是,在外部编译进行的工程,PROJECT_SOURCE_DIR仍然指源码路径,而PROJECT_BINARY_DIR则指编译路径,也就是我们生成二进制文件路径。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值