【opencv源码解析0.4】如何使用cmake来管理项目

news2024/11/15 19:27:33

如何使用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/355643.html

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

相关文章

矩阵中的路径-剑指Offer-java深度优先

一、题目描述给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。单词必须按照字母顺序&#xff0c;通过相邻的单元格内的字母构成&#xff0c;其中“相邻”单元格是那些水平相…

k8s部署mysql+初始化数据

1. 准备工作 1.k8s的前置内容需要提前了解 2.mysql的初始化数据 3.docerk相关知识点需要了解 2. 部署步骤 初始化数据文件准备&#xff0c;准备了nacos的一张表sql脚本&#xff0c;需要修改一点点内容 文件名称&#xff1a;init-nacos.sql 部分内容显示&#xff1a; 主要创建…

潘长江张杰再现狂飙名场面,一般人把握不住

潘长江张杰再现狂飙名场面&#xff0c;一般人把握不住#我们的客栈#高启强#老墨我饿了 在昨晚播出的《我们的客栈》在猜人游戏的环节中&#xff0c;张杰和潘长江商量了一番&#xff0c;决定还原《狂飙》某一名场面&#xff0c;没想到被张维伊一秒猜出&#xff0c;张维伊还说这是…

图像分类竞赛进阶技能:OpenAI-CLIP使用范例

OpenAI-CLIP 官方介绍 尽管深度学习已经彻底改变了计算机视觉&#xff0c;但目前的方法存在几个主要问题:典型的视觉数据集是劳动密集型的&#xff0c;创建成本高&#xff0c;同时只教授一组狭窄的视觉概念;标准视觉模型擅长于一项任务且仅擅长于一项任务&#xff0c;并且需要大…

【QT专栏】QT中实现多线程的四种方式总结(金针菇般细)

目录 一、继承QThread 1&#xff0c;基本概念 2&#xff0c;操作流程 二、继承QObject&#xff08;推荐&#xff09; 1&#xff0c;基本概念 2&#xff0c;操作流程 三、继承QRunnable&#xff0c;配合QThreadPool实现多线程 1&#xff0c;外界通信 2&#xff0c;QMet…

SpringSecurity的安全认证的详解说明(附完整代码)

SpringSecurity登录认证和请求过滤器以及安全配置详解说明 环境 系统环境&#xff1a;win10 Maven环境&#xff1a;apache-maven-3.8.6 JDK版本&#xff1a;1.8 SpringBoot版本&#xff1a;2.7.8 根据用户名密码登录 根据用户名和密码登录&#xff0c;登录成功后返回Token数据…

狂神聊Redis复习笔记一

目录目前一个基本的互联网项目&#xff01;NoSQL 特点Redis 是什么&#xff1f;Redis 能干嘛&#xff1f;特性测试性能基础的知识Redis 是单线程的&#xff01;Redis 为什么单线程还这么快&#xff1f;五大数据类型Redis-KeyString&#xff08;字符串&#xff09;List&#xff…

[软件工程导论(第六版)]第3章 需求分析(复习笔记)

文章目录3.1 需求分析的任务3.2 与用户沟通获取需求的方法3.3 分析建模与规格说明3.4 实体-联系图&#xff08;E-R图&#xff09;3.5 数据规范化3.6 状态转换图3.7 其他图形工具3.8 验证软件需求需求分析是软件定义时期的最后一个阶段&#xff0c;需求分析的基本任务是准确的回…

EASYui+C#web

第一步创建一个web应用程序。 选择web应用程序。 第二步选择mvc框架 创建完成项目目录。 如图引入easyui包。 记住复制到content文件夹&#xff0c;否则无法识别。 easyui下载&#xff0c;官网。 如何用 引入jscss文件 <link rel"stylesheet" type"text…

Guitar Pro8手机电脑免费版吉他软件下载

Guitar Pro8是专业的吉他软件&#xff0c;具有可视化的五线谱编辑器&#xff0c;涵盖常用的乐器和特殊乐器单元&#xff0c;内置海量吉他音色效果和1000多个乐器音色&#xff0c;成为一个小型音乐站&#xff0c;制作出动听的音乐&#xff0c;支持边看边听&#xff0c;添加音频轨…

【论文阅读】 Few-shot object detection via Feature Reweighting

Few-shot object detection的开山之作之一 ~~ 特征学习器使用来自具有足够样本的基本类的训练数据来 提取 可推广以检测新对象类的meta features。The reweighting module将新类别中的一些support examples转换为全局向量&#xff0c;该全局向量indicates meta features对于检…

使用MindSpore20.0的API快速实现深度学习模型之数据变换

文章目录前言一. 实验环境二. 安装ubuntu虚拟机2. 1.下载ubuntu镜像2.2 配置虚拟机2.3 安装操作系统三. 安装MindSpore20.0-alpha3.1 下载需要的安装程序脚本3.2 安装MindSpore 2.0.0-alpha和Python 3.73.3 开始手动安装3.4. 安装gcc3. 5.安装MindSpore3.6. 验证是否成功&#…

【opencv源码解析0.3】调试opencv源码的两种方式

调试opencv源码的两种方式 上两篇我们分别讲了如何配置opencv环境&#xff0c;以及如何编译opencv源码方便我们阅读。但我们还是无法调试我们的代码&#xff0c;无法以我们的程序作为入口来一步一步单点调试看opencv是如何执行的。 【opencv源码解析0.1】VS如何优雅的配置ope…

有效提升英语论文写作的方法

这里结合我的一些经验&#xff0c;分享一些练习英语论文写作的方法。 论文是由单词&#xff0c;句子&#xff0c;还有逻辑三部分组成&#xff0c;每个部分的要求都不太一样&#xff0c;这里分成三个部分练习讨论: 1炼词, 2 炼句,3 炼逻辑. 炼词 首先&#xff0c;炼词就是首先…

发布npm库遇到的

&#xff08;1&#xff09;首先首先要检查源是npm还是淘宝镜像源&#xff0c;因为本地设置了淘宝镜像源的原因&#xff0c;会导致npm login出错&#xff0c;需要修改&#xff1a; npm config set registry https://registry.npmjs.org 查看是否修改成功&#xff1a;得到上面源…

SpringCloud - Eureka注册发现

目录 提供者与消费者 Eureka原理分析 搭建Eureka服务 服务注册 服务发现 提供者与消费者 服务提供者&#xff1a; 一次业务中&#xff0c;被其它微服务调用的服务(提供接口给其它微服务)服务消费者&#xff1a; 一次业务中&#xff0c;调用其它微服务的服务(调用其它微服务…

基于jeecgboot的flowable流程增加节点自动跳过功能

为了满足有时候需要在某个节点没有人员处理的时候需要自动跳过&#xff0c;所以增加了这个功能。 一、FlowComment意见里增加一个类型8&#xff0c;跳过流程 /** * 流程意见类型 * */ public enum FlowComment { /** * 说明 */ NORMAL("1", "…

Java8新特性全面

文章目录一、函数式接口二、Java内置函数式接口三、接口内允许添加默认实现的方法四、Lambda表达式五、方法引用六、Stream API七、Stream API示例1. Filter过滤2. Sorted排序3. Map转换4. Match匹配5. Count计数6. Reduce7. Parallel-Streams并行流8. Map集合八、新时间日期接…

天津+发展得到的权重

添加评分添加评分的依据高德地图找到如图数据&#xff0c;容积率体现楼层高度近似反映人口密度&#xff0c;繁华程度近似等价霓虹灯照明时长住房容积率具体是指在城市规划区的某一宗地内&#xff0c;房屋的总建筑面积与宗地面积的比值&#xff0c;分为实际容积率和规划容积率两…

链表学习基础

链表 通过指针串联在一起的线性结构&#xff0c;每个节点由数据域和指针域两部分组成。链表节点在内存中的存储通常不是连续的&#xff0c;各节点通过指针连接在一起&#xff0c;其内存分布大致如下图所示。 定义 单链表 struct ListNode {// DATATYPE 可以是任意存放数据的…