CMake学习笔记(一)

用cmake单独编译一个源程序

Posted by 婷 on November 17, 2019 本文总阅读量

什么是CMake和CMakeLists.txt

百度百科记载,CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。只是 CMake 的组态档取名为 CMakeLists.txt。Cmake 并不直接建构出最终的软件,而是产生标准的建构档(如 Unix 的 Makefile 或 Windows Visual C++ 的 projects/workspaces),然后再依一般的建构方式使用。这使得熟悉某个集成开发环境IDE)的开发者可以用标准的方式建构他的软件,这种可以使用各平台的原生建构系统的能力是 CMake 和 SCons 等其他类似系统的区别之处。

个人理解的话就是CMake就是一个可以编译C或者C++代码的工具,它会根据你CMakeLists里面的内容去编译你的工程代码,最后再产生你需要的东西,例如可执行性文件。

CMake编译一个源程序

编写CMakeLists.txt

首先创建一个总的文件夹demodemo里面的目录树如下。

demo
├── build
├── CMakeLists.txt
└── main.c

1.png

CMakeLists.txt文件如下。

cmake_minimum_required(VERSION 2.8) #指定CMake的最小版本

project(demo)#这是你的项目名称

#这个指令是编译完main.c后产生一个可执行文件,类似于gcc main.c -o main
add_executable(main main.c)

main.c内容如下。

#include <stdio.h>

int main(void)
{
	printf("this is a cmake demo\n");
	return 0;
}

build文件现在暂时还是个空文件夹。到时候它是用来存放cmake编译过程中产生的一些中间文件,有个专门的文件夹来存放,就不会让整个工程显得混乱,可以将中间文件跟其他的源文件区分开来。

编译

接下来在demo下打开终端。先进入build文件夹。

2.png

然后敲入命令cmake ..

3.png

为什么命令是cmake .. 呢,因为cmake要去查找对应的CMakeLists.txt文件,而这个文件是在我们现在路径下的上一级目录所以就需要..,而cmake就把产生的中间文件放在了现在的路径下,也即build文件夹。

这时候再看看我们build文件夹里面的内容。

4.png

再看下我们的目录树。

demo
├── build
│   ├── CMakeCache.txt
│   ├── CMakeFiles
│   │   ├── 3.12.2
│   │   │   ├── CMakeCCompiler.cmake
│   │   │   ├── CMakeCXXCompiler.cmake
│   │   │   ├── CMakeDetermineCompilerABI_C.bin
│   │   │   ├── CMakeDetermineCompilerABI_CXX.bin
│   │   │   ├── CMakeSystem.cmake
│   │   │   ├── CompilerIdC
│   │   │   │   ├── a.out
│   │   │   │   ├── CMakeCCompilerId.c
│   │   │   │   └── tmp
│   │   │   └── CompilerIdCXX
│   │   │       ├── a.out
│   │   │       ├── CMakeCXXCompilerId.cpp
│   │   │       └── tmp
│   │   ├── cmake.check_cache
│   │   ├── CMakeDirectoryInformation.cmake
│   │   ├── CMakeOutput.log
│   │   ├── CMakeTmp
│   │   ├── feature_tests.bin
│   │   ├── feature_tests.c
│   │   ├── feature_tests.cxx
│   │   ├── main.dir
│   │   │   ├── build.make
│   │   │   ├── cmake_clean.cmake
│   │   │   ├── DependInfo.cmake
│   │   │   ├── depend.make
│   │   │   ├── flags.make
│   │   │   ├── link.txt
│   │   │   └── progress.make
│   │   ├── Makefile2
│   │   ├── Makefile.cmake
│   │   ├── progress.marks
│   │   └── TargetDirectories.txt
│   ├── cmake_install.cmake
│   └── Makefile
├── CMakeLists.txt
└── main.c

可以看到cmake .. 之后build文件夹多了很多中间文件出来。注意cmake ..命令执行完毕终端最后输出的一句话。

-- Build files have been written to: /home/copyright/桌面/demo/build

这时候可以看到文件夹下面有个Makefile文件。而我们的可执行文件main,还没有出现。接下来在终端敲入make命令。(注意要在你Makefile在的文件夹执行make命令才会实现我们最终的目标,产生可执行文件main。)

5.png

执行完make命令后可以发现产生了一个main可执行文件。

6.png

运行

在终端敲入命令./main

7.png

当当当~可以看到最后的输出结果。运行成功。

最后

cmake编译一个源文件来产生一个可执行文件,貌似一句gcc xxx.c -o xxx命令就可以解决了,在这里只能说是大材小用。更多时候cmake是用来编译一个工程里面多个源文件,这样子就不用每次都要gcc xxx.c -o xxx。不过用cmake来单独编译一个源程序,对于CMakeLists.txt的编写来说比较简单,所以接下来准备学习如何编写一整个工程的CMakeLists.txt文件。