CMake 学习笔记 01 - CMake 简介
CMake 学习笔记 01 - CMake 简介
源代码见 https://github.com/fengyc/cmake-tutorial
CMake 是一个跨平台的 makefile 工具,帮助开发者组织 c/c++ 项目。它是比 make 更加高级的工具,能生成不同平台上的 makefile ,如 windows 上的 vcproj 和 mac 上是 xcode 项目。同时,还支持定义安装 install 、测试 ctest 、打包 package 、生成 dashboard 等高级功能。
CMake 使用 CMakeLists.txt 文件定义编译配置,同时能嵌套子目录,子目录中可以有自己的 CMakeLists.txt 。分目录中包含了子目录后,CMake 就能运行子目录中定义的编译配置。
CMake 的官方网站是 http://cmake.org ,由于 KDE 的开发过程中使用 CMake 构建而被大家逐步接受。
CMake 比较简单,但还是需要学习一下一些简单的语法。
这一系列的学习笔记是根据 cmake practice 的学习内容整理的。
CMake 安装
在主要的 linux 发行版中,都可以直接安装 CMake,同时可安装 CMake 相关的配置工具,包括 cmake-curses-gui (提供 ccmake 命令), cmake-qt-gui (提供 cmake-gui 命令)。
在 ubuntu 中,直接安装 CMake ::
sudo apt-get install cmake cmake-curses-gui cmake-qt-gui
CMake helloworld
现在来创建一个使用 CMake 进行构建的项目。
建立目录 helloworld ,并创建一个 main.c ::
#include <stdio.h>
int main(int argc, char* argv[]){
printf("Hello, world!\n");
return 0;
}
同时创建一个 CMakeLists.txt ::
PROJECT(HELLO)
SET(SRC_LIST main.c)
ADD_EXECUTABLE(hello ${SRC_LIST})
开始构建,为了减少对源代码目录的干扰,我们采用外部构建的方法,在 helloworld 里面创建一个 build 目录,在 build 目录中进行构建 ::
mkdir build
(cd build; cmake .. ; make)
可看到,在 build 中已生成一堆文件,通过 tree build 命令查看
::
build
├── CMakeCache.txt
├── CMakeFiles
│ ├── 3.5.1
│ │ ├── CMakeCCompiler.cmake
│ │ ├── CMakeCXXCompiler.cmake
│ │ ├── CMakeDetermineCompilerABI_C.bin
│ │ ├── CMakeDetermineCompilerABI_CXX.bin
│ │ ├── CMakeSystem.cmake
│ │ ├── CompilerIdC
│ │ │ ├── a.out
│ │ │ └── CMakeCCompilerId.c
│ │ └── CompilerIdCXX
│ │ ├── a.out
│ │ └── CMakeCXXCompilerId.cpp
│ ├── cmake.check_cache
│ ├── CMakeDirectoryInformation.cmake
│ ├── CMakeOutput.log
│ ├── CMakeTmp
│ ├── feature_tests.bin
│ ├── feature_tests.c
│ ├── feature_tests.cxx
│ ├── hello.dir
│ │ ├── build.make
│ │ ├── C.includecache
│ │ ├── cmake_clean.cmake
│ │ ├── DependInfo.cmake
│ │ ├── depend.internal
│ │ ├── depend.make
│ │ ├── flags.make
│ │ ├── link.txt
│ │ ├── main.c.o
│ │ └── progress.make
│ ├── Makefile2
│ ├── Makefile.cmake
│ ├── progress.marks
│ └── TargetDirectories.txt
├── cmake_install.cmake
├── hello
└── Makefile
其中包含了 Makefile ,中间文件,生成的最终文件 hello 等。
helloworld 项目使用的指令
helloworld 项目的 CMakeLists.txt 只使用到 3 个指令
-
PROJECT
PROJECT 指令用于说明项目的名称,用法为
PROJECT(项目名)
,定义了项目名称后,会隐式创建两个 cmake 变量项目名_SOURCE_DIR
和项目名_BINARY_DIR
,同时也会创建PROJECT_SOURCE_DIR
和PROJECT_BINARY_DIR
,其值与前面的一致。 -
SET
SET 指令用于创建变量,用法为
SET(变量名 [value])
。变量在使用时与 shell 有点类型,求值时用${变量名}
。 -
ADD_EXECUTABLE
ADD_EXECUTABLE
用于指定生成一个可执行文件,用法为ADD_EXECUTABLE(文件名 [源代码列表])
CMake 指令是不区分大小写的,一般建议指令用大写。
在构建时,一般采用外部构建的方式,这也是 cmake 推荐的构建方式。具体的做法是建立一个专门的 build 目录(任何地方均可),然后用 cmake 源代码目录
的方式,让所有生成的中间文件都保留在 build 目录中,不会污染原始的源代码目录。清理 cmake 的时候,就可以直接删除整个 build 目录,而不需要整理源代码中的大量中间文件。