make的用法
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文件的目录下进行构建。
/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.
相关阅读
写程序大体步骤为:1.用编辑器编写源代码,如.c文件。2.用编译器编译代码生成目标文件,如.o。3.用链接器连接目标代码生成可执行文件,如