0.4如何使用cmake来管理项目

news2024/11/18 1:24:25

如何使用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语句不懂,就去百度哪个,然后再去看官方文档教程。

  1. cmake_minimum_required和project()是每个cmake工程都必须要有的。
  2. cmake有很多内置类型,我们不需要声明这些类型cmake就能知道它的含义,我们只需要直接使用set()语句对这些变量进行设置,cmake就会按照我们设置的方式运行,例如上面程序中的CMAKE_CXX_STANDARD,就代表我们编译我们工程时,使用哪个C++的标准,上面时使用了C++17标准。
  3. file()函数可以将文件整合到一个变量中,上面代码中的变量为_SRCS,变量可以随意命名,它可以理解为一个列表,里面存储了test.cpp test.h,当我们项目的文件多的时候,可以一股脑的都添加到一个变量里
  4. add_executable()是将文件编译为一个exe程序,上面我们用到了它的两个参数,分别是生成目标文件exe的目标名称,我们直接使用了我们的项目名称。第二个参数就是我们要编译的文件
  5. cmake访问变量,都是通过${变量名}来访问的

完成上面代码后,我们仿照编译opencv库的方式,来编译我们自己的cmake项目:

在这里插入图片描述

打开cmake-gui,选择源码路径、build路径后,点击Configure、Generate按钮:

在这里插入图片描述

可以看到配置、生成均成功了,在中间的options选项区域,有两个红色的选项,红色我们前面也说过,代表这两个选项第一次出现在页面上,用来提示使用者的,并不代表出错。

我们在我们短短的几行代码中,并没有添加任何选项,所以页面上出来的这两个选项是cmake默认自动生成的:

  1. CMAKE_CONFIGURATION_TYPES:项目可构建的类型,比我们熟知的Release、Debug还多了两个,大家自行百度
  2. CMAKE_INSTALL_PREFIX:项目安装目录,本项目用不上,自行百度

点击cmake-gui页面上的Open Project按钮,可以直接打开我们编译生成的VS2019工程:

在这里插入图片描述

我们可以看到三个内容:

  1. 配置选项有四个,就是我们上面提到的Debug;Release;MinSizeRel;RelWithDebInfo
  2. 左侧文件书内有我们的TestCMake解决方案,以及我们的同名项目TestCMake,里面包含test.cpp和test.h
  3. 打开test.cpp,里面是空白的,因为我们没有往里面写任何东西

现在我们编写一个经典的hello代码:

#include <iostream>
#include "test.h"

using namespace std;

int main()
{
	cout << "hello cmake!" << endl;
	return 0;
}

在这里插入图片描述

将我们的TestCMake项目设为启动项。然后运行:

在这里插入图片描述
大功告成!

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/354382.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【OJ】小熊猫的肉质品

&#x1f4da;Description: 自从可爱的小熊猫来到浙商大后便再也不想吃那些膳食纤维了&#xff0c;比如&#xff1a;竹子。所以&#xff0c;骞哥&#xfeff;不得不帮助国宝寻找一些肉类来维持能量&#xff0c;使得小熊猫不至于饿死在全球某工商。但是&#xff0c;你知道的淘…

Spring Cloud Alibaba--seata微服务详解之分布式事务(三)

上篇讲述gateway的部署和使用&#xff0c;gateway统一管理和转发了HTTP请求&#xff0c;在互联网中大型项目一定存在复杂的业务关系&#xff0c;尤其在商城类软件中如淘宝、PDD等商城&#xff0c;尤其在秒杀场景中&#xff0c;并发量可以到达千万级别&#xff0c;此时数据库就会…

第五十六章 树状数组(一)

第五十六章 树状数组一、前缀和的缺陷二、树状数组1、作用2、算法分析3、算法实现&#xff08;1&#xff09;lowbits()&#xff08;2&#xff09;插入&#xff08;3&#xff09;查询三、例题1、问题题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1提示2、代码一、前缀和…

【SCL】1200应用项目: 四节传送带机械手模拟控制

使用SCL编写小应用:四节传送带模拟和机械手模拟控制 文章目录 目录 文章目录 前言 一、四节传送带模拟控制 1.控制要求 2.参考图 3.接线图和I/0分配 4.编写程序 1.逆序启动 2.顺序停止 3.故障输入 4.调试 5.完整代码 二、机械手控制 1.控制要求 2. 接线图和I/0分配 3.编写程序 …

JVM内存模型深度剖析与优化

1. Java语言的跨平台特性 2. JVM整体结构及内存模型 堆存放着对象信息每个线程都会分配一块属于自己的内存空间&#xff08;栈空间&#xff09; 每个方法都会分配一块内存空间&#xff08;栈桢&#xff09;&#xff0c;上图 compute()方法 和 main()方法 都会分配到各自的栈桢空…

git 学习笔记

Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件,可以敏捷高效地处理任何或小或大的项目。Git 与常用的版本控制工具 CVS, Subversion 等不同&#xff0c;它采用了分布式版本库的方式&#xff0c;不需要服务器端软件支持。 一、安装配置…

线性神经网络(sotfmax回归)

sotfmax回归定义网络架构softmax运算softmax回归实现&#xff08;MNIST数据集&#xff09;数据集的处理读取数据集查看形状数据可视化读取小批量整合所有组件神经网络的搭建加载数据集初始化模型参数定义softmax函数定义模型定义损失函数&#xff08;难点&#xff09;分类精度训…

有序表之跳表

文章目录1、前言2、跳表简介3、理解“跳表”4、用跳表查询到底有多快5、跳表是不是很浪费内存6、高效的动态插入和删除7、跳表索引动态更新8、跳表代码实现1、前言 在开始讲解跳表之前&#xff0c;先来说一说积压结构。 何为积压结构&#xff1f;就是当数据达到了一定程度&am…

【ROS2实践】Vmware17下安装ubuntu22.04和ros2-humble

一、简介 ROS2-foxy已经不再维护&#xff0c;ROS2-humble成为主角&#xff0c;因而该转变一下开发场景了。如何安装&#xff1f;官方文档没有错&#xff0c;然而&#xff0c;照着做却无法进行。实超中遇到的需要变通的地方&#xff0c;官网是不给你提供解决的&#xff0c;本文给…

宽刈幅干涉高度计SWOT(Surface Water and Ocean Topography)卫星进展(待完善)

以下信息搬运自SWOT官方网站等部分文献资料&#xff0c;如有侵权请联系&#xff1a;sunmingzhismz163.com 排版、参考文献、部分章节待完善 概况 2022年12月16日地表水与海洋地形卫星SWOT (Surface Water and Ocean Topography)在加利福尼亚州范登堡航天基地由SpaceX猎鹰9号(Sp…

mysql面试题(最全)

1. 数据库三大范式是什么&#xff1f; 什么是范式&#xff1f; 范式是数据库设计时遵循的一种规范&#xff0c;不同的规范要求遵循不同的范式。 最常用的三大范式 第一范式(1NF)&#xff1a;属性不可分割&#xff0c;即每个属性都是不可分割的原子项。(实体的属性即表中的列)…

ESXi主机CVE-2021-21972漏洞复现安全处置建议

一、漏洞简介 vSphere 是 VMware 推出的虚拟化平台套件&#xff0c;包含 ESXi、vCenter Server 等一系列的软件。其中 vCenter Server 为 ESXi 的控制中心&#xff0c;可从单一控制点统一管理数据中心的所有 vSphere 主机和虚拟机。 vSphere Client&#xff08;HTML5&#xf…

【博客624】MAC地址表、ARP表、路由表(RIB表)、转发表(FIB表)

MAC地址表、ARP表、路由表(RIB表/FIB表) MAC地址表 MAC地址表是交换机等网络设备记录MAC地址和端口的映射关系&#xff0c;代表了交换机从哪个端口学习到了某个MAC地址&#xff0c;交换机把这个信息记录下来&#xff0c;后续交换机需要转发数据的时候就可以根据报文的目的MAC地…

SpringBoot社区版专业版带你配置热部署

&#x1f49f;&#x1f49f;前言 ​ 友友们大家好&#xff0c;我是你们的小王同学&#x1f617;&#x1f617; 今天给大家打来的是 SpringBoot社区版专业版带你配置热部署 希望能给大家带来有用的知识 觉得小王写的不错的话麻烦动动小手 点赞&#x1f44d; 收藏⭐ 评论&#x1…

C++类基础(十七)

类的继承——补充知识 ● public 与 private 继承&#xff08;C Public, Protected and Private Inheritance&#xff09; 改变了类所继承的成员的访问权限 //公有继承 struct Base { public:int x; private:int y; protected:int z; }; struct Derive : public Base //公有继承…

【数据结构与算法】时间复杂度与空间复杂度

目录 一.前言 二.时间复杂度 1.概念 二.大O的渐进表示法 概念&#xff1a; 总结&#xff1a; 三.常见时间复杂度计算举例 例1 例2 例3 例4 例5.计算冒泡排序的时间复杂度 例6.二分算法的时间复杂度 例7.阶乘递归Fac的时间复杂度 例8.斐波那契递归的时间复杂度 …

【MyBatis】| MyBatis的注解式开发

目录 一&#xff1a;MyBatis的注解式开发 1. Insert注解 2. Delete注解 3. Update注解 4. Select注解 5. Results注解 一&#xff1a;MyBatis的注解式开发 MyBatis中也提供了注解式开发⽅式&#xff0c;采⽤注解可以减少Sql映射⽂件的配置。 当然&#xff0c;使⽤注…

推荐几款好用的数据库管理工具

本文主要介绍几款常用的数据库管理软件&#xff08;客户端&#xff09;&#xff0c;包括开源/免费的、商用收费的&#xff0c;其中有一些是专用于 MySQL 数据库的&#xff0c;例如 MySQL Workbench、phpMyAdmin&#xff0c;有一些是支持多种 SQL、NoSQL 数据库的&#xff0c;例…

Kubernetes集群维护—备份恢复与升级

Etcd数据库备份与恢复 需要先安装etcd备份工具yum install etcd -y按不同安装方式执行不同备份与恢复kubeadm部署方式&#xff1a; 备份&#xff1a;ETCDCTL_API3 etcdctl snapshot save snap.db --endpointshttps://127.0.0.1:2379 --cacert/etc/kubernetes/pki/etcd/ca.cr…

知其然更要知其所以然,聊聊SQLite软件架构

SQLite是一个非常受欢迎的数据库&#xff0c;在数据库排行榜中已经进入前十的行列。这主要是因为该数据库非常小巧&#xff0c;而且可以支持Linux、Windows、iOS和Andriod的主流的操作系统。 SQLite非常简单&#xff0c;是一个进程内的动态库数据库。其最大的特点是可以支持不同…