首先建立文件main.c和CMakeLists.txt
然后分别输入:
#include <stdio.h>
int main()
{
printf("Hello World from t1 Main!\n");
return 0;
}
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 .
make
./hello
解释:
CMakeLists.txt,这个文件是 cmake 的构建定义文件,文件名是大小写相关的,如果工程存在多个目录,需要确保每个要管理的目录都存在一个CMakeLists.txt。
PROJECT(projectname [CXX] [C] [Java]):你可以用这个指令定义工程名称,并可指定工程支持的语言,支持的语言列表是可以忽略的,默认情况表示支持所有语言。这个指令隐式的定义了两个 cmake 变量:<projectname>_BINARY_DIR 以及<projectname>_SOURCE_DIR,里就是HELLO_BINARY_DIR 和 HELLO_SOURCE_DIR
SET 指令可以用来显式的定义变量
比如我们用到的是 SET(SRC_LISTmain.c),如果有多个源文件,也可以定义成:SET(SRC_LIST main.c t1.c t2.c)。用变量代替值,例子中定义SRC_LST代替后面的字符串
${}是用来引用变量,来对其取值,但是在IF循环中取值就不需要加这个符号
ADD_EXECUTABLE(hello main.c)中ADD_EXECUTABLE叫做指令,括号里面两个叫做参数,指令大小写不相关,参数大小写相关,但指令推荐使用大写。
如果一个文件的名字中间包括空格,比如ma in.c,那么使用SET(SRC_LIST main.c)这个语句的时候就要给main.c加上引号:SET(SRC_LIST "ma in.c")
cmake:是为了生成编译所需的Makefile以及其他中间文件
make:构建工程
外部构建:
上面的第一个cmake采用的是内部构建的方式,会在主文件夹内生成很多的临时文件,为了避免这个情况我们使用外部构建的方式:
1,首先,请清除 t1 目录中除 main.c CmakeLists.txt 之外的所有中间文件,最关键的是 CMakeCache.txt。
2,在 t1 目录中建立 build 目录,当然你也可以在任何地方建立 build 目录,不一定必须在工程目录中。
3,进入 build 目录,运行 cmake ..(注意,..代表父目录,因为父目录存在我们需要的CMakeLists.txt,如果你在其他地方建立了 build 目录,需要运行 cmake <工程的全路径>),查看一下 build 目录,就会发现了生成了编译需要的 Makefile 以及其他的中间文件.
4,运行 make 构建工程,就会在当前目录(build 目录)中获得目标文件 hello。
上述过程就是所谓的 out-of-source 外部编译,一个最大的好处是,对于原有的工程没有任何影响,所有动作全部发生在编译目录。通过这一点,也足以说服我们全部采用外部编译方式构建工程。这里需要特别注意的是:通过外部编译进行工程构建,HELLO_SOURCE_DIR 仍然指代工程路径,即
/backup/cmake/t1而 HELLO_BINARY_DIR 则指代编译路径,即/backup/cmake/t1/build
其他
make clean
即可对构建结果进行清理。
用make -j带一个参数,可以把项目在进行并行编译,比如在一台双核的机器上,完全可以用make -j4,让make最多允许4个编译命令同时执行,这样可以更有效的利用CPU资源。