如何使用cmake来管理项目
【opencv源码解析0.1】VS如何优雅的配置opencv环境
【opencv源码解析0.2】如何编译opencv库源码
【opencv源码解析0.3】调试opencv源码以及使用cmake来管理项目
前面几篇文章我们都是围绕Visual Studio 2019这个IDE来展开的,IDE为我们做了太多太多的事情,虽然使用很方便,但工程管理太臃肿,你的项目都会夹带着诸如.sln、.vcxproj、.filters、.user等等各种VS自己的工程文件:
甚至vs会给你自动生成很多诸如DLLMain、pch.h、pch.cpp等等这些完全可以省略的优化文件。
而使用cmake却很简捷,你只需要编写好你的cmake工程文件,就可以简捷的管理你的工程,就像opencv使用cmake来管理一样,不仅简捷,还可以跨平台。
简捷体现在哪呢,使用cmake来管理你的项目,所有的配置选项都会在cmake-gui的options界面显示出来供使用者配置,且源码和工程是分离的(也就是source和build是分离的)。
所以本教程同样采取cmake来管理我们的项目,项目结构如下:
项目采用cmake来管理:
- CMakeModules:一些cmake文件
- image:存放本教程用到的图片
- MCV_Code和Samples_Code:教程代码
- Tutorial:教程,主要是文档
- README.md
学习本教程,学会cmake是你必然的收获。因为学习cmake没有什么方式比参与一个由cmake管理的项目来的更快更好了。
1)cmake学习资源
学习cmake首推cmake的官方教程:
https://cmake.org/cmake/help/latest/guide/tutorial/
然后推荐一本开源书籍《cmake菜谱》:
https://www.bookstack.cn/read/CMake-Cookbook/README.md
2)如何使用cmake管理项目
我们来简单的介绍一下如何使用cmake来管理项目,我们以我们前几篇文章一直在使用的test_link_opencv这个项目来说,这个项目是直接使用VS创建的一个控制台应用程序,也就是生成exe可执行文件,我们现在先回退到链接opencv库以前的状态。
如何使用cmake来管理、生成这样一个exe项目呢:
直接创建如上三个空文件。
CMakeLists.txt名称必须如此,这是cmake的设定,我们通过在该文件内写cmake代码来完成项目的配置和管理。另外再创建一个test.cpp和test.h,我们会将这两个文件编译成一个test.exe可执行文件。
在CMakeLists.txt中写如下cmake代码:
#工程基础配置
cmake_minimum_required(VERSION 3.21 FATAL_ERROR)# 设置最低cmake版本
project(TestCMake LANGUAGES CXX)# 创建一个工程,对应VS里的解决方案,并设置工程的语言为C++
set(CMAKE_CXX_STANDARD 17)# 设置C++标准为C++17,CMAKE_CXX_STANDARD变量为cmake的内置属性变量
# 添加文件
file(GLOB _SRCS test.cpp test.h) #将.cpp .h文件,都添加到_SRCS变量中
add_executable(${PROJECT_NAME} ${_SRCS})# 将.cpp .h编译为一个exe
对以上代码做几点解释,如果还不懂的,哪个cmake语句不懂,就去百度哪个,然后再去看官方文档教程。
- cmake_minimum_required和project()是每个cmake工程都必须要有的。
- cmake有很多内置类型,我们不需要声明这些类型cmake就能知道它的含义,我们只需要直接使用set()语句对这些变量进行设置,cmake就会按照我们设置的方式运行,例如上面程序中的CMAKE_CXX_STANDARD,就代表我们编译我们工程时,使用哪个C++的标准,上面时使用了C++17标准。
- file()函数可以将文件整合到一个变量中,上面代码中的变量为_SRCS,变量可以随意命名,它可以理解为一个列表,里面存储了test.cpp test.h,当我们项目的文件多的时候,可以一股脑的都添加到一个变量里
- add_executable()是将文件编译为一个exe程序,上面我们用到了它的两个参数,分别是生成目标文件exe的目标名称,我们直接使用了我们的项目名称。第二个参数就是我们要编译的文件
- cmake访问变量,都是通过${变量名}来访问的
完成上面代码后,我们仿照编译opencv库的方式,来编译我们自己的cmake项目:
打开cmake-gui,选择源码路径、build路径后,点击Configure、Generate按钮:
可以看到配置、生成均成功了,在中间的options选项区域,有两个红色的选项,红色我们前面也说过,代表这两个选项第一次出现在页面上,用来提示使用者的,并不代表出错。
我们在我们短短的几行代码中,并没有添加任何选项,所以页面上出来的这两个选项是cmake默认自动生成的:
- CMAKE_CONFIGURATION_TYPES:项目可构建的类型,比我们熟知的Release、Debug还多了两个,大家自行百度
- CMAKE_INSTALL_PREFIX:项目安装目录,本项目用不上,自行百度
点击cmake-gui页面上的Open Project按钮,可以直接打开我们编译生成的VS2019工程:
我们可以看到三个内容:
- 配置选项有四个,就是我们上面提到的Debug;Release;MinSizeRel;RelWithDebInfo
- 左侧文件书内有我们的TestCMake解决方案,以及我们的同名项目TestCMake,里面包含test.cpp和test.h
- 打开test.cpp,里面是空白的,因为我们没有往里面写任何东西
现在我们编写一个经典的hello代码:
#include <iostream>
#include "test.h"
using namespace std;
int main()
{
cout << "hello cmake!" << endl;
return 0;
}
将我们的TestCMake项目设为启动项。然后运行:
大功告成!