opencvb 十七 使用cmake配置opencv c++项目
1、cmake简介
1.1 cmake是什么
CMake是一个开源、跨平台的编译(Build)工具,是用来构建、测试和打包软件的。它能够用简单的语句来描述所有平台的编译过程。它能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。 CMake并不直接生成最终的软件,而是产生标准的建构文件(如Unix的Makefile或Windows Visual ,C++的projects/workspaces),这些文件可以被一般的编译工具所使用。
1.2 cmake能做什么
CMake是一个跨平台的构建自动化工具,可以自动生成跨平台的Makefile、Visual Studio等IDE项目、Xcode项目和Ninja build等常见项目文件。CMake的工作方式是通过读取CMakeLists.txt文件中的指令来生成相应的项目文件,从而支持多种编译器、操作系统、硬件架构等,为跨平台开发提供方便。CMake的具体功能包括但不限于:
- 编译源代码、制作程序库。CMake自己不编译程序,而是使用CMakeLists.txt构建脚本指挥各种编译工具生成可执行程序或链接库。
- 产生适配器(wrapper)。CMake还可以用任意的顺序建构执行档。
- 支持in-place建构(二进制文件和源代码在同一个目录树中)和out-of-place建构(二进制文件在别的目录里),因此可以很容易从同一个源代码目录树中构建出多个二进制文件。
- 测试编译器所支持的C++特性。
- 自定义编译选项和平台特定的配置,从而使软件可以在多个平台上正确地编译和运行。
- 自动检测在系统中已经安装的库和头文件,从而避免了手动配置环境变量和链接库的繁琐工作。
- 与其他构建工具(如make、Visual Studio等)无缝集成,这意味着开发者可以使用CMake来生成构建文件,然后将这些文件用作其他构建工具的输入,从而实现更高效的自动化构建过程。
总之,CMake是一个功能强大的跨平台自动化构建工具,能够大大提高软件编译和安装的效率和便利性。
1.3 cmake有什么优点
CMake是一个跨平台的构建系统,它有以下优点:
- 可移植性:CMake的目标是产生一种能与多种编译器以及在不同的操作系统上工作的构建系统。这使得CMake成为一个非常适合用于开源项目的构建系统,这些项目通常需要多种环境下的编译。
- 模块化:CMake的模块化设计使得它可以方便地添加或移除功能。例如,你可以轻松地为项目添加一个新的子目录,并为其添加一个新的CMakeLists.txt文件。
- 灵活性:CMake提供了一种名为"generator"的系统,允许你定制构建过程。例如,你可以为IDE生成项目文件,或者为持续集成系统生成构建任务。
- 可扩展性:CMake支持使用自定义的命令和函数来扩展其功能。这使得CMake非常适合用于大型的、复杂的项目,其中可能需要一些特殊的构建逻辑。
- 文档和社区支持:CMake有一个丰富的文档和活跃的社区,这意味着当你在使用CMake时遇到问题,你可以很容易地找到答案。
- 支持多种语言:CMake可以用于构建用多种语言编写的项目,包括C、C++、Fortran等。
*跨平台:它可以在三大主流平台上(Windows、Unix/Linux、MacOS)生成各自平台上的建构文件,从而编译出最终的可执行文件。 - 集成测试:CMake提供了方便的机制来编写测试用例,并可以将其集成到持续集成系统中。
- 灵活的缓存系统:CMake有一个灵活的缓存系统,可以让你存储和共享变量的值,这在大型项目中尤其有用。
- 持续集成友好:CMake可以很容易地与持续集成系统集成,例如Jenkins或CircleCI。这意味着你可以轻松地在这些系统中设置自动构建和测试任务。
以上就是CMake的一些优点,这使得它成为了一个强大且灵活的构建系统,无论是对于小型项目还是大型项目都非常适用
1.4 cmake下载安装
cmake 可直接在官网上下载,官网地址:https://cmake.org/
cmake Windows版本的安装配置详情可参考:https://blog.csdn.net/weixin_52677672/article/details/135815928
2、使用cmake生成c++项目
2.1 CMakeLists.txt文件配置使用
CMakeLists.txt 文件是用于描述 CMake 构建过程和项目配置的文件。它包含了一系列 CMake 命令、变量设置和流程控制结构,用于告诉 CMake 如何生成适合你的平台和编译器的构建系统文件。
常见内容和结构:
project():设置项目名称和版本号。
cmake_minimum_required():设置 CMake 的最低版本要求。
set():设置变量的值。
add_executable():添加可执行文件。
add_library():添加库文件。
target_link_libraries():链接库文件。
include_directories():添加头文件目录。
link_directories():添加lib文件路径
具体使用案例:
cmake_minimum_required(VERSION 3.5.1)
#生成项目的名称
project(iris_recognition)
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
set(CMAKE_SUPPRESS_REGENERATION FALSE)
#设置生成release项目
set(CMAKE_BUILE_TYPE RELEASE)
set(CMAKE_CXX_STANDARD 14)
# It prevents the decay to C++98 when the compiler does not support C++14
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# It disables the use of compiler-specific extensions
# e.g. -std=c++14 rather than -std=gnu++14
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")#set library path
set(OpenCV_DIR E:/Lib/opencv470/)
message("如果目录中包含空格,请使用\对空格进行转义")file(GLOB SOURCE_FILES src/*.cpp)
include_directories(${OpenCV_DIR}/include${PROJECT_SOURCE_DIR}/include
)
link_directories(${OpenCV_DIR}/x64/vc16/lib
)
#add_library(${CMAKE_PROJECT_NAME} STATIC ${SOURCE_FILES})
add_executable(${CMAKE_PROJECT_NAME} ${SOURCE_FILES}) #生成可执行程序 项目
add_library(iris_recognition_dll SHARED ${SOURCE_FILES}) #生成动态链接库 项目target_link_libraries(${CMAKE_PROJECT_NAME}opencv_world470.lib
)
#target_link_libraries(
# mytest
# opencv_world470.lib
#)
target_link_libraries(iris_recognition_dllopencv_world470.lib
)
2.2 项目结构
与CMakeLists.txt相对应的目录结构如下图所示,一般来说,有include目录,src目录和CMakeList.txt文件即可。
2.3 CMake (cmake-gui)操作过程
根据配置好的CMakeLists.txt文件,CMake (cmake-gui)可将c++代码封装为可执行文件,更便捷的是CMake (cmake-gui)还可将c++代码封装为动态链接库,实现C++代码python 端的调用。在文本中,一般都是创建一个 build 用来存放 cmake 构建和编译的产物。CMake (cmake-gui)具体操作过程如下:
第一步:设置所需编译的C++代码路径和build 文件路径。
第二步:单击Configure 。
第三步:单击Generate。
完成前面三步后,CMake (cmake-gui)已经根据配置好的CMakeLists.txt文件,生成了相应的build 文件,并将cmake 构建和编译的产物存入了build文件夹中。
第四步,单击Open Projrct,即可打开Visual Studio。
如果单击Open Projrct之后反应太慢,还可直接打开创建好的build文件,直接单击生成的可执行文件,启动Visual Studio。
build 目录详情
其中iris_recognition.sln是生成的vs项目工程文件,通过双击该文件打开项目。
相关文章:

opencvb 十七 使用cmake配置opencv c++项目
1、cmake简介 1.1 cmake是什么 CMake是一个开源、跨平台的编译(Build)工具,是用来构建、测试和打包软件的。它能够用简单的语句来描述所有平台的编译过程。它能够输出各种各样的makefile或者project文件,能测试编译器所支持的C特…...

Java8 中文指南(一)
Java8 中文指南(一) 文章目录 Java8 中文指南(一)《Java8 指南》中文翻译接口的默认方法(Default Methods for Interfaces)Lambda 表达式(Lambda expressions)函数式接口(Functional Interfaces)方法和构造函数引用(Method and Co…...

引流技术-通过文件中增加联系方式并传播
文章目录 前言文档增加联系方式扩散网盘扩散自建网站借力 注意 前言 很多人在找资料的时候可能都遇到过下图情况: 1、文档最后面留一个自己的联系方式; 2、找的一堆文件中都有相同的情况; 3、一段时间全网搜到的很多相同文件也有这个联系方式…...

分布式搜索引擎_学习笔记_2
分布式搜索引擎_学习笔记_2 在昨天的学习中,我们已经导入了大量数据到elasticsearch中,实现了elasticsearch的数据存储功能。但elasticsearch最擅长的还是搜索和数据分析。 所以今天,我们研究下elasticsearch的数据搜索功能。我们会分别使用…...

【学习笔记】树上差分总结(点差分/边差分)
一.树上差分的基本概念 1.树上差分的定义 树上差分,顾名思义,意思就是在树上做差分。 至于什么是差分呢?如果不会的同学,可以先看看我的这篇博客:一维,二维差分の详解(简单易懂)_一维差分-CSDN博客 2.树…...

Vue.js设计与实现(霍春阳)
Vue.js设计与实现 (霍春阳) 电子版获取链接:Vue.js设计与实现(霍春阳) 编辑推荐 适读人群 :1.对Vue.js 2/3具有上手经验,且希望进一步理解Vue.js框架设计原理的开发人员; 2.没有使用过Vue.js,但对Vue.js框架设计感兴趣…...

go消息队列RabbitMQ - 订阅模式-fanout
1、发布订阅 订阅模式,消息被路由投递给多个队列,一个消息被多个消费者获取。 1) 可以有多个消费者 2) 每个消费者有自己的queue(队列) 3) 每个队列都要绑定到Exchange(交换机&…...
科普类——5G远程实时操控技术在国内港口应用简介(十三)
在中国,5G远程实时操控技术已经在多个港口得到应用,并且应用规模不断扩大,展现出良好的发展前景。以下是一些具体的应用案例: 上港集团洋山港:上港集团与华为合作,在全球港口首次将F5G技术应用于超远程控制…...

整理:汉诺塔简析
大体上,要解决一个汉诺塔问题,就需要解决两个更简单的汉诺塔问题 以盘子数量 3 的汉诺塔问题为例 要将 3 个盘子从 A 移动到 C,就要: 将两个盘子从 A 移动到 B(子问题 1) 为了解决子问题 1,就…...
Android 8.1 设置--声音中增加通话音量
Android 8.1 设置--声音中增加通话音量 近来收到项目需求,想要在设置--声音中增加一项通话音量调节,具体修改参照如下: /vendor/mediatek/proprietary/packages/apps/MtkSettings/res/values/strings.xml <!-- Sound: Title for the opt…...

C#中使用OpenCvSharp4绘制直线、矩形、圆、文本
C#中使用OpenCvSharp4绘制直线、矩形、圆、文本 继之前的Python中使用Opencv-python库绘制直线、矩形、圆、文本和VC中使用OpenCV绘制直线、矩形、圆和文字,将之前的Python和C示例代码翻译成C#语言,很简单,还是借用OpenCvSharp4库中的Line、…...

Qt程序设计-自定义控件(提升法)
本文讲解如何使用提升法自定义控件,控件有界面。 实现自定义一个开关控件,控件上显示当前的状态。实现过程如下: 1、在创建的项目上,添加qt设计界面类。 2、选择widget 3、更改名称为MySwitchButton 4、添加两个图标资源文件,用来显示开关状态 5、添加两个label,一个…...
计算机网络基础知识笔记
1 HOST和PORT Claude-2-100k: 我来用简单的语言解释一下HOST和PORT这两个网络术语: HOST就是设备的IP地址,比如"127.0.0.1"就是我们本机的IP地址; PORT就是端口号,可以把它简单理解为设备上的门牌号。 举个类比,我们要给某个人发信件,需要知道…...

【iOS ARKit】2D肢体动作捕捉
人体肢体动作捕捉在动漫影视制作、游戏CG 动画、实时模型驱动中有着广泛的应用,利用 ARKit,无须额外的硬件设备即可实现 2D和3D人体一系列关节和骨骼的动态捕捉,由于移动AR 的便携性及低成本,必将促进相关产业的发展。 ARBody Tr…...
MAC word删除空白页
问题:MAC word删除空白页 解决: option删除键...
字面跳动前端面试题:React Hook为什么不能放在if/循环/嵌套函数里面?
答:首先,React Hooks 是为了简化组件逻辑和提高代码可读性而设计的。将 Hook 放在 if/循环/嵌套函数中会破坏它们的封装性和可预测性,使得代码更难维护和理解。同时,这样做也增加了代码的复杂度,可能会导致性能下降和潜…...

【SpringBoot】SpringBoot的web开发
📝个人主页:五敷有你 🔥系列专栏:SpringBoot ⛺️稳重求进,晒太阳 Wbe开发 使用Springboot 1)、创建SpringBoot应用,选中我们需要的模块; 2)、SpringBoot已经默…...
houdini 入门指南-参考自用,内有翻译错误
HOUDINI 18.5列1 GETTING STARTED 入门指南 What’s new in Houdini 18.5 胡迪尼18.5有什么新内容 New features and changes in Houdini 18.5.胡迪尼18.5的新功能和变化。Basics基础The basics of working with Houdini’s user interface.使用胡迪尼用户界面的基本知识。Shel…...
【笔记】SPN和PLMN 运营商网络名称显示
一、业务术语 缩写 全称 释义 CDNR Carrier Display Name Ressource 运营商显示名称资源 PLMN Public Land Mobile Network 公共陆地移动网络。 表示最终显示的网络运营商名字 SPN Service Provider Name SIM卡EF文件6F46。表示服务提供商名字,主要是SIM卡服务 OPL Operator …...

Selenium处理Alert弹窗
页面弹窗有 3 种类型: alert(警告信息) confirm(确认信息) prompt(提示输入) 对于页面出现的 alert 弹窗,Selenium 提供如下方法: 序号 方法/属性 描述 1 ac…...

低代码开发模式下的应用交付效率优化:拖拽式交互机制研究
低代码开发平台凭借其可视化操作、快速构建、灵活扩展等核心特性,正在成为推动企业数字化转型的重要工具。 拖拽式开发,降低技术门槛 :图形化界面与模块化组件,用户无需编写复杂代码,只需通过简单的拖拽即可完成应用搭…...

大数据量下的数据修复与回写Spark on Hive 的大数据量主键冲突排查:COUNT(DISTINCT) 的陷阱
背景与问题概述 这一周(2025-05-26-2026-05-30)我在搞数据拟合修复优化的任务,有大量的数据需要进行数据处理及回写,大概一个表一天一分区有五六千万数据,大约一百多列的字段。 具体是这样的我先取档案&#x…...
基于BERT-Prompt的领域句子向量训练方法
基于BERT-Prompt的领域句子向量训练方法 一、核心原理:基于BERT-Prompt的领域句子向量训练方法 论文提出一种结合提示学习(Prompt Learning)和BERT的领域句子向量训练方法,旨在解决装备保障领域文本的语义表示问题。核心原理如下: 以下通过具体例子解释传统词向量方法和…...
【C/C++】基于 Docker 容器运行的 Kafka + C++ 练手项目
文章目录 基于 Docker 容器运行的 Kafka C 练手项目1 项目目的2 项目框架3 代码4 编译运行5 功能与接口说明5.1 Producer 接口:producer.cpp关键调用流程参数说明 5.2 Consumer 接口:consumer.cpp关键调用流程消费流程中注意 5.3 工程技术点 基于 Docke…...
vllm 2080TI ubuntu环境安装
#TOC 欢迎使用Markdown编辑器安装gcc 9 sudo add-apt-repository ppa:ubuntu-toolchain-r/testsudo apt-get install gcc-9 g-9sudo apt-get install gcc-9 g-9sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 90 --slave /usr/bin/g g /usr/bin/g-9gcc …...
Android Cameara2 + MediaRecorder 完成录像功能
一、打开相机、预览 打开相机预览流程是Camera2的默认流程 可参考:https://blog.csdn.net/kk3087961/article/details/135616576 二、开启录像功能 开启录像主要包括以下3步: private void startRecording() {// 1. 停止预览并关闭会话if (mCameraSes…...
QT6.9中opencv引用路径的其中一种设置
RC_ICONSappimage.ico unix|win32: LIBS -L$$PWD/opencv455/vc15/lib/ -lopencv_world455 INCLUDEPATH $$PWD/opencv455/include DEPENDPATH $$PWD/opencv455/include RC_ICONS为指定图标文件,只写图标名appimage.ico,那么一般和pro文件在同一目录…...

DeepSeek 提示词大全
目录 前言一、提示词基础理论 什么是提示词提示词的类型提示词的基本结构 二、提示词设计原则 明确指令结构化表达情境化需求渐进式引导边界与限制 三、场景化提示词模板 写作创作类角色扮演类信息提取类代码编程类教育学习类商业营销类生活助手类 四、提示词优化技巧 迭代式优…...

技术为器,服务为本:AI时代的客服价值重构
在智能化浪潮中,大语言模型的出现为客户服务行业注入了全新动能。然而技术创新的价值不在于技术本身,而在于其赋能服务的深度与广度。AI对于我们来说,如同发动机之于汽车,重要的不是引擎参数,而是整车带给用户的驾驶体…...

C++ RB_Tree
一、红黑树是什么?—— 带颜色标记的平衡二叉搜索树 红黑树是一种自平衡二叉搜索树,它在每个节点上增加了一个颜色属性(红色或黑色),通过对颜色的约束来确保树的大致平衡。这种平衡策略被称为 "弱平衡"&…...