CMake了解一下
又来制造垃圾文章了,这次记录一下折腾使用Cmake的过程。
本篇摘自大佬博客,然后自己实践一遍才写的。
CMake是什么
CMake is an open-source, cross-platform family of tools designed to build, test and package software. CMake is used to control the software compilation process using simple platform and compiler independent configuration files, and generate native makefiles and workspaces that can be used in the compiler environment of your choice. The suite of CMake tools were created by Kitware in response to the need for a powerful, cross-platform build environment for open-source projects such as ITK and VTK. — cmake.org
瞎翻译:CMake 是开源、跨平台的编译构建、测试、打包软件的工具,生成您所在平台的makefile工作环境,它最初由Kitware创建。为包括ITK和VTK等开源项目的强大跨平台构建环境的需求提供支持。
解决的问题
我们先来看一下各平台的Make工具:
- Microsoft – MS nmake;
- GNU – GNU Make;
- QT – qmake
- BSD Make – pmake;
- Makeapp;
这些Make工具有着不同的标准和规范,Makefile格式也都不同,所以想要跨平台的软件可能需要根据不同的平台编写Makefile,这样做产生了很大的问题。那么有没有一种解决方案能一下子解决所有Makefile的编写问题,不用重复工作,CMake正是做这样事情的工具。
使用流程
创建项目
- 编写项目(对就是正常的写项目);
- 编写 CMakeList.txt 来制定编译流程;
- 测试、发布项目;
CMakeList.txt 文件来定制整个编译流程,然后再根据目标用户的平台进一步生成所需的本地化 Makefile 和工程文件,如 Unix 的 Makefile 或 Windows 的 Visual Studio 工程。从而做到“Write once, run everywhere”。 –hahack
编译项目
- 执行
cmake PATH
或ccmake PATH
,生成Makefile; - 正常的通过Makefile执行
make
编译项目;
(很简单难道不是么?)
开始折腾使用
一个单源文件的编译
main.c
1 | //main.c |
编译
日常的编译流程
1 | gcc -o main main.c |
使用CMake的编译流程
创建 CMakeLists.txt 在项目目录中
1 | cmake_minimum_required (VERSION 2.8)# CMake 最低版本号要求 |
执行 cmake .
1 | remi@REMI_IOs-MacBook$ ~/mycode/crow/testcmake cmake . |
biubiubiu~~~
1 | CMakeCache.txt CMakeLists.txt cmake_install.cmake |
目录就变成酱紫了,是的生成了Makefile
,再make
加热一下可以吃了
多个文件的编译
假若我们在 main.c 中调用了同目录下 func.c 中的函数只需要按照以上修改一下 CMakeLists.txt 即可
1 | cmake_minimum_required (VERSION 2.8)# CMake 最低版本号要求 |
当然如果目录中文件变得很多的话可以这样做:(不用一个个的写文件名)
1 | cmake_minimum_required (VERSION 2.8)# CMake 最低版本号要求 |
子目录编译
目录结构是酱子:
1 | ./Hello |
CMakeLists.txt :
1 | cmake_minimum_required (VERSION 2.8) |
- add_subdirectory 是声明包含的子目录
在子目录中func/
中的 CMakeLists.txt:
1 | aux_source_directory(. PROJECT_PATH_FUNC) |
使用add_library
将子目录func中的所有内容编译成静态链接库。
今天就实验到这里,之后再跟进继续~