使用mingw+CMake在Windows平台编译OpenCV

news/2024/11/27 8:36:01/

1. 安装mingw和cmake

        cmake的安装比较简单,百度一下完成相关操作即可,笔者安装的是3.24.3版本。

        Mingw的安装也有很多相关文章,不过我使用的是安装QT时附带安装的mingw,其路径为D:\software\Qt\Tools\mingw1120_64。其中的bin文件夹中包含了gcc和g++的可执行程序,打开后发现存在多个类似名称的文件,如"c++.exe"、"g++.exe"、“x86_64-w64-mingw32-g++.exe”等。实际对比后发现"c++.exe"、"g++.exe"、“x86_64-w64-mingw32-g++.exe”这三个文件完全相同,因此使用其中任意一个设为c++编译器均可正常工作。

        方便起见,这里会把D:\software\Qt\Tools\mingw1120_64\bin加入环境变量中,这样系统就能自动定位到相关的exe和库文件,避免后期手动拷贝相关文件。

2. mingw&CMake组合使用初探

        新建一个HelloQt.cpp,内容如下

#include <iostream>int main(int argc, char** argv)
{std::cout<<"Hello Qt!"<<std::endl;return 0;
}

        同文件夹下新建一个CMakeLists.txt,内容如下

cmake_minimum_required(VERSION 3.5.0)
project(HelloQt)if(NOT CMAKE_BUILD_TYPE)set(CMAKE_BUILD_TYPE Debug)
endif()
message("CMAKE_BUILD_TYPE = ${CMAKE_BUILD_TYPE}")set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99")add_executable(HelloQt HelloQt.cpp)

1)使用cmake-gui

        先尝试使用cmake-gui完成构建,打开cmake-gui,选择对应的源码目录和编译目录;选择“Configure”按钮后,如下勾选然后点击Next按钮。

        之后分别指定C和C++的文件路径,对应到MingW的bin文件夹中的gcc.exe和g++.exe,点击Finish按钮。cmake会开始构建,然后再点击左下方Generate按钮,会在编译目录生成Makefile,此时就可以在命令行窗口中使用mingw32-make.exe执行编译了。运行编译得到的exe,效果符合预期

2)使用cmake命令行

        这个项目相对简单很多,直接执行cmake -G "MinGW Makefiles" ..即可完成构建,效果如下

3. 编译OpenCV

        由于编译OpenCV时存在多个编译选项,方便起见这里使用cmake-gui进行构建。这里笔者勾选了BUILD_SHARED_LIBS和BUILD_opencv_world,会编译生成一个带world后缀的共享库,而不是多个库。

        构建过程和上面相似,在生成了make文件后,通过mingw32-make.exe 和mingw32-make.exe install完成编译和安装。

4. 使用OpenCV

        修改HelloQt.cpp,在里面调用OpenCV的API完成图像的读取和显示,如下所示。

#include <iostream>
#include <opencv2/opencv.hpp>int main(int argc, char** argv)
{cv::Mat img = cv::imread("text_img_0.jpg");if(img.empty()){std::cout<<"Error: img is empty!"<<std::endl;}cv::imshow("img", img);cv::waitKey(0);std::cout<<"Hello Qt!"<<std::endl;return 0;
}

        同时修改CMakeLists.txt,引入对OpenCV库和头文件的寻找和使用,如下。

cmake_minimum_required(VERSION 3.5.0)
project(HelloQt)if(NOT CMAKE_BUILD_TYPE)set(CMAKE_BUILD_TYPE Debug)
endif()
message("CMAKE_BUILD_TYPE = ${CMAKE_BUILD_TYPE}")set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99")set(CMAKE_PREFIX_PATH D:/SDK/OpenCV/opencv-3.4.7/build/mingw_x64_world_without_contrib/install)
find_package(OpenCV  REQUIRED)include_directories(${OpenCV_INCLUDE_DIRS}
)add_executable(HelloQt HelloQt.cpp)
target_link_libraries(HelloQt ${OpenCV_LIBS})

        使用命令行构建,可顺利完成编译和运行,完结撒花~


http://www.ppmy.cn/news/1550295.html

相关文章

【数据结构实战篇】用C语言实现你的私有队列

&#x1f3dd;️专栏&#xff1a;【数据结构实战篇】 &#x1f305;主页&#xff1a;f狐o狸x 在前面的文章中我们用C语言实现了栈的数据结构&#xff0c;本期内容我们将实现队列的数据结构 一、队列的概念 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端…

租赁小程序|租赁系统搭建|租赁系统需求

随着信息技术的高速发展&#xff0c;租赁行业逐渐向智能化、便捷化方向迈进。一款优秀的租赁小程序&#xff0c;旨在为用户提供一站式的租赁服务体验&#xff0c;同时帮助租赁企业优化管理流程&#xff0c;提高业务效率。 一、用户需求精准把握 在开发任何软件产品时&#xff0…

C# 结构体

文章目录 前言一、结构体的定义与基本使用&#xff08;一&#xff09;定义结构体&#xff08;二&#xff09;结构体的使用示例 二、C# 结构的特点&#xff08;一&#xff09;丰富的成员类型&#xff08;二&#xff09;构造函数相关限制与特性&#xff08;三&#xff09;继承方面…

JavaScript的扩展运算符...

在JavaScript的世界里&#xff0c;扩展运算符&#xff08;...&#xff09;是一个多功能的工具&#xff0c;它可以在多种不同的上下文中使用&#xff0c;以实现不同的功能。从数组到对象&#xff0c;再到函数&#xff0c;扩展运算符都能大显身手。本文将深入探讨扩展运算符的用法…

使用 Django 构建支持 Kubernetes API 测试连接的 POST 接口

文章目录 使用 Django 构建支持 Kubernetes API 测试连接的 POST 接口功能需求使用 kubectl 获取 Token命令解析输出示例 完整代码实现Kubernetes API 客户端类功能说明 Django 接口视图关键点解析 路由配置 接口测试请求示例响应结果成功错误 优化建议1. 安全性2. 错误处理3. …

PyTorch3

自动微分&#xff1a; 自动微分模块torch.autograd负责自动计算张量操作的梯度&#xff0c;具有自动求导功能。自动微分模块是构成神经网络训练的必要模块&#xff0c;可以实现网络权重参数的更新&#xff0c;使得反向传播算法的实现变得简单而高效。 张量&#xff1a; Torc…

深入解析 Django 中数据删除的最佳实践:以动态管理镜像版本为例

文章目录 引言场景与模型设计场景描述 删除操作详解1. 删除单个 Tag2. 批量删除 Tags3. 删除前确认4. 日志记录 高阶优化与问题分析1. 外键约束与误删保护2. 并发删除的冲突处理3. 使用软删除 结合 Django Admin 的实现总结与实践思考 引言 在现代应用开发中&#xff0c;服务和…

精准零售驱动下的中国零售业变革与“开源 2+1 链动小程序”应用探究

摘要&#xff1a;本文聚焦于中国零售业正迈向的精准零售这一重要趋势&#xff0c;阐述新科技融入促使零售业业态革新&#xff0c;剖析未来零售在商品、供应链、物流系统层面的发展方向与支撑要素。深入解读精准零售内涵及其与现代零售业经营理念、业务方式的契合性&#xff0c;…