当前位置: 首页 > article >正文

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

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.kler.cn/a/411526.html

相关文章:

  • JAVA---IO
  • RL78/G15 Fast Prototyping Board Arduino IDE 平台开发过程
  • Qt中2D绘制系统
  • 用el-scrollbar实现滚动条,拖动滚动条可以滚动,但是通过鼠标滑轮却无效
  • 5.5 W5500 TCP服务端与客户端
  • CentOS 7安装SSHFS 实现远程主机目录 挂载为本地目录
  • 政安晨【零基础玩转各类开源AI项目】探索Cursor-AI Coder的应用实例
  • element-plus动态判断表单是否是必填项。出错时显示的错误。在不是必填项时为什么还能显示
  • flink学习(8)——窗口函数
  • Diffusion异常检测相关论文及代码整理
  • MySQL底层概述—3.InnoDB线程模型
  • godot游戏引擎_瓦片集和瓦片地图介绍
  • Python开源项目月排行 2024年10月
  • thinkphp日志记录到文件
  • 【大数据学习 | Spark-Core】RDD的五大特性(包含宽窄依赖)
  • Oracle RAC 环境下数据文件误建在本地目录的处理过程
  • TCP/IP网络编程-C++(上)
  • C++设计模式之组合模式在解决层次性问题中的好处
  • 基于Kubernetes编排部署EFK日志收集系统
  • 项目二:m序列的设计与实现(FPGA)
  • C++ 中的多继承
  • 【044】基于51单片机数码管时钟【Proteus仿真+Keil程序+报告+原理图】
  • PyQt5控件QWebEngineView(WebView)
  • yolov11剪枝
  • Hive-定时清理无用的临时表
  • Ajax局部刷新,异步请求