前言

在学习CMake的过程中,深感CMake不仅仅是学习C++路上的一个构建工具,完全是一门独立的语言,所以抽出时间来学习了一下基本的用法。

首先参考的是官方文档,阅读官方文档的过程中,感觉每一条命令讲述的很全,但是并没有说明如何组织CMakeLists.txt的内容,对新手并不友好;而且官方文档大而全,如果全部学完的话,估计会费些时日。

本着学以致用的原则,参考了CMake实践一文,网上可以搜到相关pdf教程,写了这个示例代码。可以根据自己项目的需求,稍微修改调整。等以后有了其它的需求之后,再回过头来学习CMake的其它用法。

github仓库地址:CMakeExample

功能

包含了如下常见的功能,可根据自己的项目需求,注释、放开注释对应的命令:

  1. 设置版本号;
  2. 自己编写cmake模块;
  3. 设置项目支持C++11;
  4. 设置环境变量;
  5. 指定编译选项(Debug、Release等);
  6. 构建库(动态库、静态库);
  7. 构建可执行程序;
  8. 安装;

目录组织

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_majorprogram_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负责安装可执行程序;

标签: CMake

添加新评论