什么是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
首先创建一个总的文件夹demo
,demo
里面的目录树如下。
demo
├── build
├── CMakeLists.txt
└── main.c
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
文件夹。
然后敲入命令cmake ..
。
为什么命令是cmake ..
呢,因为cmake
要去查找对应的CMakeLists.txt
文件,而这个文件是在我们现在路径下的上一级目录所以就需要..
,而cmake
就把产生的中间文件放在了现在的路径下,也即build
文件夹。
这时候再看看我们build
文件夹里面的内容。
再看下我们的目录树。
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
。)
执行完make
命令后可以发现产生了一个main
可执行文件。
运行
在终端敲入命令./main
。
当当当~可以看到最后的输出结果。运行成功。
最后
用cmake
编译一个源文件来产生一个可执行文件,貌似一句gcc xxx.c -o xxx
命令就可以解决了,在这里只能说是大材小用。更多时候cmake
是用来编译一个工程里面多个源文件,这样子就不用每次都要gcc xxx.c -o xxx
。不过用cmake
来单独编译一个源程序,对于CMakeLists.txt
的编写来说比较简单,所以接下来准备学习如何编写一整个工程的CMakeLists.txt
文件。