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项目工程文件,通过双击该文件打开项目。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

云打印机怎么连接手机?

现在越来越多的人使用手机来办公或学习。而当我们需要打印文件时,如何用云打印机连接手机就非常重要了。易绘创云打印服务非常实用,那么易绘创云打印机又该怎么连接手机?下面就让我们一起来了解吧。 云打印机怎么连接手机? 当下云打印机连接…

opencv#40 图像细化

图像细化原理 作用:图像细化是将图像的线条从多像素宽度减少到单位像素宽度的过程,又被称为“骨架化”,删除像素点的标准: 通常情况下,我们使用二值化图像,我们在判断是否要删除某些像素点时,要…

基于YOLOv8的足球赛环境下足球目标检测系统(Python源码+Pyqt6界面+数据集)

博主简介 AI小怪兽,YOLO骨灰级玩家,1)YOLOv5、v7、v8优化创新,轻松涨点和模型轻量化;2)目标检测、语义分割、OCR、分类等技术孵化,赋能智能制造,工业项目落地经验丰富; …

壹[1],Xamarin开发

1,环境 VS2022 注: 1,本来计划使用AndroidStudio,但是也是一堆莫名的配置让人搞得很神伤,还是回归C#。 2,MAUI操作类似,但是很多错误解来解去,且调试起来很卡。 3,最…

Java 数据抓取

大家好我是苏麟 , 今天聊聊数据抓取 . 大家合理使用 注意,爬虫技术不能滥用,干万不要给别人的系统造成压力、不要侵犯他人权益! 数据抓取 实质上就是java程序模拟浏览器进行目标网站的访问,无论是请求目标服务器的接口还是请求目标网页内容…

如何在python中“开小灶” —— python异步线程指导

文章目录 一、问题来源二、注意事项三、举例 一、问题来源 问题是这样的,在python中写代码遇到个问题,跑程序时有某一步很耗时,导致接口响应的时间很慢,那么就有个办法,把这一步放入异步线程中,主线程走主…

idea Statistic使用

问题描述:本地idea版本为2018.3.5,安装Statistic插件后没有出现Statistic图标 原因如下:插件版本太新了,需要历史版本 解决办法: IDEA安装代码统计插件Statistic后左下角图标出不来(亲测)_idea statistic不展示-CSD…

生成式AI应用开发参考架构

人机交互正在迅速经历软件开发在过去二十年中从未见过的巨大范式转变。 从传统的基于规则的系统到复杂的生成人工智能 (GAI) 模型,破译用户意图并提供准确、上下文丰富的响应的方法已变得至关重要。 在本系列文章中,我将深入探讨利用 GAI 重新构想应用程…

《向量数据库指南》——AIGC 需求的快速变化,催生了Milvus Cloud向量数据库的超高速迭代

对于“版本”成为热度排名第一的关键词,我开始是有点意外的,仔细一想似乎也在情理之中。2023年,是 AIGC 大爆发的一年,LLM 展现出了强大的分析、推理、归纳、总结能力。但是,由于缺乏最新的和特定领域的训练数据,大模型“幻觉”成为困扰 AIGC 开发者的一大难题。随着 RAG…

基于腾讯云自然语言处理 NLP服务实现文本情感分析

文章目录 一、前言二、NLP 服务简介三、Python 调用腾讯云 NLP 服务 SDK 构建情感分析处理3.1 开通腾讯云 NLP 服务3.2 创建的腾讯云持久证书(如果已创建请跳过)3.2 在腾讯云服务器中安装 Git 工具以及 Python 环境3.3 安装 qcloudapi-sdk-python3.4 部署…

Kotlin快速入门系列11

Kotlin的集合 集合类 Java类库有一套相当完整的容器集合类用来持有对象。跟Java一样,集合类存放的都是对象的引用,而非对象本身(我们经常说的集合指的是集合中对象的引用),Kotlin的集合类是在Java的集合类库基础上进行的优化,新引…

Zookeeper分布式队列实战

目录 Zookeeper分布式队列 普通方式实现 设计思路 具体实现 使用Curator实现 具体实现 注意事项 Zookeeper分布式队列 常见的消息队列有:RabbitMQ,RocketMQ,Kafka等。Zookeeper作为一个分布式的小文件管理系统,同样能实现简单的队列功…