CMake的用法1——初识

1,序

   具体如何安装,以及安装什么版本,此处就不细细和大家说了,此处我们认为最新版即最稳定,用的人也最多,认可度最广泛,无论何时你看到此文章,请务必都这么认为。本系列将有若干篇文章,本人也是cmake小白一只,虽然四五年前也略有接触,但完全是稀里糊涂。从本文开始,将一点点拨开cmake迷雾,探索使用cmake这个传说中的神器。

2,第一个程序——hello world

   cmake类似于一个shell,实际上就是将我们的文本命令进行解释,然后跳转执行相关的处理语句,再生成相关文件,供后面的make程序做进一步处理。

输入:命令行参数,配置文件信息(用于控制cmake的行为,我们可以理解为程序)。
处理:cmake根据命令行输入的参数、配置文件内容来进行处理。
输出:makefile.txt等相关文件,供下面的程序处理。

   由此可以看出,cmake就是个文本处理程序。下面介绍第一个工程。

1,文件组织

   首先在home目录下创建一个cmakeExperiment目录,以后我们的所有实验都将在此目录中进行。在该目录下,创建第一个实验目录t1。本文中,我们将在以下目录中进行所有实验。

/home/cmakeExperiment/t1/

   向t1目录中添加CMakeLists.txt和main.c文件。其中CMakeLists.txt用来指导cmake工作的配置文件,main.c为源文件。注意名称大小写。

CMakeLists.txt
main.c

2, 添加内容

   下面是main.c的代码

// main.c
#include <stdio.h>
int main(int ac, char **av) {
        printf("hello world\n");
        return 0;
}

   下面是CMakeLists.txt的内容。注意,这个文件是固定的,cmake只认识该文件名。下面的双斜线注释不是cmake的注释格式,仅为说明。

PROJECT(HELLO) // 将本工程命名为HELLO
SET(SOURCE main.cpp) // 设置变量列表
MESSAGE(STATUS "this is binary dir" ${HELLO_BINARY_DIR}) // 输出信息
MESSAGE(STATUS "this is source dir" ${HELLO_SOURCE_DIR})
ADD_EXECUTABLE(hello ${SOURCE}) // 可执行文件名为hello,其依赖于SOURCE变量中所列出的文件

3,编译与执行

   在t1目录下创建build目录,即目录结构如下。此种方式为“外部构建”,即生成的makefile.txt不在源代码所在的文件夹中,而是凡在了build文件夹,我们推荐这种方式——源代码和生成的中间文件不会混合在一起。“内部构建”就是直接在源代码文件夹下,包含CMakeLists.txt文件的目录下进行构建。

扫描二维码关注公众号,回复: 3482655 查看本文章

/home/cmakeExperiment/t1/build

   在build目录下分别执行下面命令。

$ cmake .. // 注意此处”..”为CMakeLists.txt文件所在的目录

$ make

   可以看到目录中生成了名为hello的可执行文件,执行该文件即可。

3,进一步解释CMakeLists.txt文件

1,PROJECT(HELLO)

   该指令定义工程名称,该指令的语法为:

project(projectName [CXX] [C] [JAVA]) //指定支持的语言。

   该指令隐式定义了两个cmake变量,这两个变量即为目标文件目录和源文件目录。

projectName_BINARY_DIR 和 projectName_SOURCE_DIR

   同时,cmake与定义了如下两个变量,这两个变量的值和HELLO_BINARY_DIR和HELLO_SOURCE_DIR的值相同。由于每次修改工程名称都需要修改HELLO_BINARY_DIR和HELLO_SOURCE_DIR,因此建议使用如下两个变量。

PROJECT_BINARY_DIR 和 PROJECT_SOURCE_DIR

2,SET(valueName valueList)

   set指令用于将valueList赋给valueName,valueList用空格进行分隔。

SET(valueName main.cpp hello.cpp process.cpp)

3,ADD_EXECUTABLE

   该命令指定依赖关系,ADD_EXECUTABLE(hello main.c)也可以。

4,其他

1, ${}表示引用变量。
2, 指令大小写不敏感,但是推荐使用大写来写指令。
3, 参数可以使用分号进行间隔。比如:set(valueList valueName1 valueName2 valueName3)或者 set(valueList valueName1;valueName2;valueName3)

  需要注意,工程名称和可执行文件之间没有任何关系,工程是一个组织名称,标识该工程。而可执行文件只是工程中的一个文件,工程名称不依赖于工程内的文件名称——除了CMakeLists.txt文件。

[参考文献]
[1] cjacker. cmake practice.

猜你喜欢

转载自blog.csdn.net/zhizifengxiang/article/details/80624739