一、简介
1.1 cmake 作为构建工具,具有对大项目的管理能力
1.2 特点
①开放源代码
②跨平台:在Linux平台生成Makefile
③能够管理大项目
④工具链简单:cmake+make
1.3 注意事项
每个目录都要有CMakeLists
二、实例1.helloworld
2.1 大概有7步
①新建目录cmake
mkdir cmake
②在cmake下创建目录t1
mkdir t1
③进入目录t1
④在t1目录建立main.c和CMakeLists.txt
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})
⑤在t1目录下输入指令 cmake .(注意命令后的点号,代表本目录)
输入后发现系统自动生成了很多文件,且生成了Makefile
⑥在t1目录输入指令make
这时,目标文件hello生成
⑦在t1目录输入指令 ./hello 运行
得到输出 Hello World from t1 Main
2.2 解释一下CMakeLists.txt
先简单说3点:
①CMakeLists.txt文件格式:指令名(参数1 参数2 参数3 参数4)
②指令是大小写无关的,参数和变量是大小写相关的
③各个参数用空格隔开,数量可选,但是需要按顺序
PROJECT (HELLO)
//PROJECT(projectname CXX [C] Java)
//定义工程名称,并可指定工程支持的语言,支持的语言列表是可以忽略的,默认情况表示支持所有语言
//这个指令隐式的定义了两个 cmake 变量:<projectname>_BINARY_DIR以及<projectname>_SOURCE_DIR
//这里就是HELLO_BINARY_DIR和HELLO_SOURCE_DIR,前者为编译路径,后者为工程路径,值都是工程所在路径/cmake/t1
SET(SRC_LIST main.c)
//SET(VAR VALUE)
//显式的定义变量即可,此处将main.c赋值给SRC_LIST
//如果有多个源文件,也可以定义成:SET(SRC_LIST main.c t1.c t2.c)。
MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR})
MESSAGE(STATUS "This is SOURCE dir "${HELLO_SOURCE_DIR})
//MESSAGE(STATUS "message to display" ...)
//用于向终端输出用户定义的信息
//可以输出三种类型的信息:
//①SEND_ERROR,产生错误,生成过程被跳过。
//②SATUS,输出前缀为--的信息。此处为该应用,输出两个由PROJECT函数自动生成的两个变量的值
//在这里的使用变量格式为:${变量名};后文在IF语句中需要使用其他格式
//③FATAL_ERROR,立即终止所有cmake 过程.
ADD_EXECUTABLE(hello ${SRC_LIST})
//定义了这个工程会生成一个文件名为hello 的可执行文件
//这里需要特别解释的是作为工程名的 HELLO 和生成的可执行文件 hello 是没有任何关系的
//你也可以直接写成ADD_EXECUTABLE(hello main.c)
//如果存在另外一个 func.c源文件,就要写成:ADD_EXECUTABLE(hello main.c func.c)
2.3 简化CMakeLists.txt
PROJECT(HELLO)
ADD_EXECUTABLE(hello main.c)
2.4 工程清理
make clean
三、内部构建与外部构建
随便说三点:
①上一个实例是内部构建,下一个实例为外部构建
②外部构建使得工程更加清晰,使用广泛
③不扯概念,实践了就知道区别了
四、实例2.外部构建的helloworld
4.1 大概有5步
①在cmake/目录下建立t2目录
将t1 工程的 main.c和 CMakeLists.txt 拷贝到t2目录中。
②在t2目录下
mkdir src
mv main.c src
现在的工程看起来是这个样子:一个子目录src,一个 CMakeLists.txt。
③在src目录下建立一个 CMakeLists.txt
编写 CMakeLists.txt 如下:
ADD_EXECUTABLE(hello main.c)
④修改t2 目录下的 CMakeLists.txt
PROJECT(HELLO)
ADD_SUBDIRECTORY(src bin)
⑤在t2 目录下建立build 目录,进入build目录进行外部编译
cmake ..
make
构建完成后,你会发现生成的目标文件 hello 位于 build/bin目录中
4.2 解释一下
ADD_SUBDIRECTORY(src bin)
//ADD_SUBDIRECTORY(source_dir binary_dir)
//将src子目录加入工程,并指定编译输出(包含编译中间结果)路径为bin目录