CMake项目示例
前言
在学习CMake的过程中,深感CMake不仅仅是学习C++路上的一个构建工具,完全是一门独立的语言,所以抽出时间来学习了一下基本的用法。
首先参考的是官方文档,阅读官方文档的过程中,感觉每一条命令讲述的很全,但是并没有说明如何组织CMakeLists.txt的内容,对新手并不友好;而且官方文档大而全,如果全部学完的话,估计会费些时日。
本着学以致用的原则,参考了CMake实践
一文,网上可以搜到相关pdf教程,写了这个示例代码。可以根据自己项目的需求,稍微修改调整。等以后有了其它的需求之后,再回过头来学习CMake的其它用法。
github仓库地址:CMakeExample
功能
包含了如下常见的功能,可根据自己的项目需求,注释、放开注释对应的命令:
- 设置版本号;
- 自己编写cmake模块;
- 设置项目支持C++11;
- 设置环境变量;
- 指定编译选项(Debug、Release等);
- 构建库(动态库、静态库);
- 构建可执行程序;
- 安装;
目录组织
CMakeExample
|-- cmake
| `-- FindGREETING.cmake
|-- CMakeLists.txt
|-- COPYRIGHT
|-- doc
| `-- hello.txt
|-- greeting
| |-- CMakeLists.txt
| |-- greeting.cpp
| `-- greeting.h
|-- include
| `-- Config.h.in
|-- README.md
|-- runhello.sh
`-- src
|-- CMakeLists.txt
`-- main.cpp
cmake
目录为自己的编写的模块存放路径;CMakeLists.txt
为最顶层CMakeLists.txt;COPYRIGHT
为版权说明,可有可无;doc
目录为程序的文档手册存放路径;greeting
为库代码所在路径,目录下方的CMakeLists.txt
控制库的生成,包含动态库和静态库;include
为头文件所在路径;runhello.sh
为启动脚本;src
为源代码所在路径,目录下方的CMakeLists.txt
控制可执行程序的生成;
使用方法
设置版本号
只需要修改顶层CMakeLists.txt
中的program_version_major
、program_version_minor
两个变量值即可。
自己编写的cmake模块
参考cmake/FindGREETING.cmake
文件,一般不需要自行编写模块。
设置项目C++11支持
因为set (CMAKE_CXX_STANDARD 11)
仅支持cmake3.1之后的版本,所以为了通用性,采用了SET(CMAKE_CXX_FLAGS "-std=c++0x")
的写法。
感觉这也是CMake难学的原因之一,版本之间的差异较大,要想实现某一功能,有多种方法可以实现,这也给新学者带来了迷惑性。
指定编译选项
默认为RelWithDebInfo
,即release版本,带调试信息。可以通过在构建的时候指定-DCMAKE_BUILD_TYPE=XXX
来修改。
构建库
参考greeting/CMakeLists.txt
,里面有注释,写的很明白。
构建可执行程序
参考src/CMakeLists.txt
,里面有注释,写的很明白。
安装
分别参考每个目录下的CMakeLists.txt
。
- 顶层
CMakeLists.txt
负责安装文档、执行脚本; greeting/CMakeLists.txt
负责安装动态库、静态库、库的头文件;src/CMakeLists.txt
负责安装可执行程序;