目录结构
|t1
|-CMakeLists.txt
|-main.c
main.c
//main.c
#include <stdio.h>
int main()
{
printf("Hello World from t1 Main!\n");
return 0;
}
CMakeLists.txt
PROJECT (HELLO)
#这个指令隐式的定义了两个 cmake 变量:
#<projectname>_BINARY_DIR 以及<projectname>_SOURCE_DIR,这里就是
#HELLO_BINARY_DIR 和 HELLO_SOURCE_DIR,
#因为采用的是内部编译,两个变量目前指的都是工程所
#在路径/path/to/t1,后面我们会讲到外部编译,两者所指代的内容会有所不同。
#同时 cmake 系统也帮助我们预定义了 PROJECT_BINARY_DIR 和 PROJECT_SOURCE_DIR
#变量,他们的值分别跟 HELLO_BINARY_DIR 与 HELLO_SOURCE_DIR 一致。
#为了统一起见,建议以后直接使用 PROJECT_BINARY_DIR,PROJECT_SOURCE_DIR,即
#使修改了工程名称,也不会影响这两个变量。如果使用了
#<projectname>_SOURCE_DIR,修改工程名称后,需要同时修改这些变量
SET(SRC_LIST main.c)
#如果有多个源文件,也可以定义成:
#SET(SRC_LIST main.c t1.c t2.c)。
#SET(SRC_LIST main.c) 也可以写成 SET(SRC_LIST “main.c”)
#SET(SRC_LIST “fu nc.c”) 不能写成 SET(SRC_LIST fu nc.c)
MESSAGE(STATUS "This is HELLO_BINARY_DIR ${HELLO_BINARY_DIR}")
MESSAGE(STATUS "This is HELLO_SOURCE_DIR ${HELLO_SOURCE_DIR}")
MESSAGE(STATUS "This is PROJECT_SOURCE_DIR ${PROJECT_SOURCE_DIR}")
MESSAGE(STATUS "This is PROJECT_BINARY_DIR ${PROJECT_BINARY_DIR}")
#MESSAGE 指令的语法是:
#MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message to display" ...)
#这个指令用于向终端输出用户定义的信息,包含了三种类型:
#SEND_ERROR,产生错误,生成过程被跳过。
#SATUS,输出前缀为—的信息。
#FATAL_ERROR,立即终止所有 cmake 过程
ADD_EXECUTABLE(hello ${SRC_LIST})
#等价写法
#ADD_EXECUTABLE(hello main.c func.c)
#ADD_EXECUTABLE(hello main.c;func.c)
#此外,你可以可以忽略掉 source 列表中的源文件后缀,比如可以写成
#ADD_EXECUTABLE(t1 main),cmake 会自动的在本目录查找 main.c 或者 main.cpp
#等,当然,最好不要偷这个懒,以免这个目录确实存在一个 main.c 一个 main.cpp
#${}来引用变量,这是 cmake 的变量应用方式,但是,有一些例外,比
#如在 IF 控制语句,变量是直接使用变量名引用,而不需要${}。如果使用了${}去应用变
#量,其实 IF 会去判断名为${}所代表的值的变量,那当然是不存在的了
#内部构建与外部构建
#我们刚才进行的是内部构建(in-source build),而 cmake 强烈推荐的是外部构建(out-of-source build)。
#1. 在 t1 目录中建立 build 目录
#2. 进入 build 目录,运行 cmake ..
#3. make
#out-of-source 外部编译,一个最大的好处是,对于原有的工程没
#有任何影响,所有动作全部发生在编译目录。通过这一点,也足以说服我们全部采用外部编译方式构建工程