mingw 配置 opencv与vscode
mingw 配置 opencv
- mingw的安装配置
- mingw 的安装以及环境变量的添加
- cmake安装
- opencv 编译安装
- opencv 下载安装
- opencv 编译
- g++ 手动编译
- .exe 文件的运行
- vscode配置
- 其他库配置示例
- eigen
- eigen 编译
- eigen 配置
- raylib
- 编译安装
- vscode 配置
前几天想起来要用opencv-cpp了,本来我的编程环境全塞到wsl里面去了,但是wsl没法使用摄像头除非手动添加驱动编译安装,这就算了实在,没这个能力win上为了matlab之类的还是保留了一个mingw编译器,那就用mingw配置opencv得了
该教程并不是要求你严格按照我的步骤来进行配置,而是根据编译链接的原理,一点点讲一下该怎么配置,希望这个教程能对你有足够的帮助
mingw的安装配置
mingw 的安装以及环境变量的添加
tdm-gcc下载 我这里的mingw用的是tdm-gcc封装的64位版本
下载后可随便修改安装位置
之后记得添加环境变量
PathTo/TDM-GCC64/bin
可选部分
根据所学的编译方式,除了gcc,g++,之外还有make工具,但是用在终端里面输入make -v
结果显示未找到make,该问题是是mingw编译器里的make
被命名为mingw32-make.exe
为了方便调用同时不会对编译器造成额外问题,复制mingw32-make.exe
将其另存为make.exe
这样就能在终端里面方便的调用make工具了
cmake安装
cmake 本人不怎么用,直接安装即可,因为win上一般用的是gui,所以无所谓添加环境变量
cmake 下载地址
opencv 编译安装
opencv 下载安装
opencv官网的官网比较操蛋,去opencv.org的source Forge页面下载会识别设备型号自动跳转到这个页面,但是这个玩意是MSVC编译的文件,mingw是无法使用的,只能采用编译安装,而OpenCV的源码挂在github下,下载源码可能需要科学上网之类的,不想各显神通我提供夸克网盘下载 这玩意不限速
链接在这
opencv 编译
解压opencv 文件,新建一个build(你可以随意命名)文件夹用于存放cmake构建文件,在cmake-gui工具中选定source文件夹与build文件夹,点击configure会自动检测你的cpp编译器环境,直接采用默认编译器,等一会后配置结束
可选部分
配置里面有个选项
BUILD_opencv_world,该选项会把所有其他.dll封装为一个libopencv_world460.dll,后续调用时只需要调用这么一个动态链接即可,该动态链接较大,但是不点也行,只是后面调用需要调用多个动态链接,每个链接都比较小,可以个人化定制。
点击generate 即可生成build文件,耐心等一会
之后在你的build文件夹里打开终端,或者任意位置打开终端跳转到build文件里
# 如果你重命名了 mingw32-make
# 那么可以执行
# 否则用 mingw32-make 替代
make -j 8
# 这个 8 指的是你编译配置用的cpu核数量
make install
编译完成后的文件全部在 PathTo/build/install
内,opencv的其他文件已经不再需要了
可选部分
为了方便管理,我将install 文件夹剪切出来重命名为opencv460,460为版本号
g++ 手动编译
在配置vscode 等编辑器之前,先用手动编译的方式来了解一下opencv的cpp文件编译器到底干啥了,测试文件如下
#include <opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;int main()
{VideoCapture cap(0);Mat img;while (1){cap >> img;if (img.empty())break;namedWindow("img", WINDOW_NORMAL);imshow("img", img);if (27 == waitKey(20))break;}return 0;
}
如果直接
g++ opencv_tst.cpp
结果报错找不到头文件
实际上在g++等编译时如果需要添加标准库以外的库函数时需要额外指定,方法时
g++ opencv_tst.cpp -I PathTo/opencv/include
那么继续手动编译
g++ .\opencv_tst.cpp -I D:\ProEnv\opencv460\include\
结果是已经定义了opencv的头文件,但是没有具体的方法实现,依旧报错
对于非标准的cpp库文件编译链接时又需要一个额外参数
g++ -L PathTo\opencv\lib -l opencv_core -l *****
这里的 -I
是指定库文件夹位置,-l
是链接动态库或者静态库
-l opencv_core
实际上是去链接 libopencv_core.a 或者libopencv_core.so文件
类型 | linux | win |
---|---|---|
静态链接 | .a | .lib |
动态链接 | .so | .dll |
但是mingw是在win上实现的g++编译器,所以很蛋疼的是目前编译出来的静态链接是.a文件
观察一下当前编译出来的全部文件
可以发现既有动态链接.dll文件(bin文件夹下)又有静态链接.a文件(lib文件夹下)
为了体验一下动态链接和静态链接有什么区别,两种链接方式都去试一试
链接那些文件呢?具体我其实不太清楚,如果有洁癖,一点点试一下,不想麻烦全连接了,或者勾选之前的选项,生成一个大的链接文件,只需要链接一个就可以了
那么链接时只需要链接opencv_modules core这两个链接
注意的是静态链接的名称是libopencv_core.dll.a
所以编译链接时需要
g++ .\opencv_tst.cpp -I D:\ProEnv\opencv460\include\ -L D:\ProEnv\opencv460\lib\ -l opencv_core460.dll -l opencv_video460.dll -l opencv_highgui460.dll -l opencv_videoio460.dll -o tst1.exe
经过测试 成功编译 为 tst1.exe
为了深入研究一下静态链接和动态链接的区别,再用动态链接编译一下试一试
g++ .\opencv_tst.cpp -I D:\ProEnv\opencv460\include\ -L D:\ProEnv\opencv460\bin\ -l opencv_core460 -l opencv_video460 -l opencv_highgui460 -l opencv_videoio460 -o tst2.exe
成功将其编译为tst2.exe
对比一下编译后的文件
明显两个文件大小相同,源文件也相同,几乎可以判定是同一个文件,运行这两个程序
结果都一样找不到.dll文件
理论上来说 链接静态库后库函数会被打包到.exe里,tst1.exe理论上可以独立运行,而动态库的则不会被打包进去,tst2.exe必须依赖.dll文件,对比一下静态文件和动态文件的体积,可以看到静态文件明显小于动态文件很多,个人理解是opencv偷了懒,将静态文件变成了对动态文件的查找
.exe 文件的运行
那么在自己电脑上如何去运行这些.exe文件呢,当前只需要让.exe找到.dll文件即可
两种方法
- 将 .dll文件与.exe文件放在同一目录下
- 让电脑能查询到.dll文件,即添加环境变量
把程序给其他人用的时候推荐方法1,自己在电脑上玩的时候推荐方法2
之后即可正常运行
vscode配置
对于tool级别的代码,最理想的情况就是一键F5 编译运行
更具刚才的手动编译的教程,可以对vscode 的配置进行修改以达到当前目的
- 先是c_cpp_properties.json
- 需要添加对 opencv的支持
- includePath 中添加 “D:/ProEnv/opencv460/include”,
- 对task.json的修改
- 在args中添加参数
- “-fdiagnostics-color=always”,
“-g”,
“file","−I","D:/ProEnv/opencv460/include","−L","D:/ProEnv/opencv460/bin","−l","opencvcalib3d460","−l","opencvcore460","−l","opencvdnn460","−l","opencvfeatures2d460","−l","opencvflann460","−l","opencvgapi460","−l","opencvhighgui460","−l","opencvimgcodecs460","−l","opencvimgproc460","−l","opencvml460","−l","opencvobjdetect460","−l","opencvstitching460","−l","opencvphoto460","−l","opencvvideo460","−l","opencvvideoio460","−o","{file}", "-I", "D:/ProEnv/opencv460/include", "-L", "D:/ProEnv/opencv460/bin", "-l", "opencv_calib3d460", "-l", "opencv_core460", "-l", "opencv_dnn460", "-l", "opencv_features2d460", "-l", "opencv_flann460", "-l", "opencv_gapi460", "-l", "opencv_highgui460", "-l", "opencv_imgcodecs460", "-l", "opencv_imgproc460", "-l", "opencv_ml460", "-l", "opencv_objdetect460", "-l", "opencv_stitching460", "-l", "opencv_photo460", "-l", "opencv_video460", "-l", "opencv_videoio460", "-o", "file","−I","D:/ProEnv/opencv460/include","−L","D:/ProEnv/opencv460/bin","−l","opencvcalib3d460","−l","opencvcore460","−l","opencvdnn460","−l","opencvfeatures2d460","−l","opencvflann460","−l","opencvgapi460","−l","opencvhighgui460","−l","opencvimgcodecs460","−l","opencvimgproc460","−l","opencvml460","−l","opencvobjdetect460","−l","opencvstitching460","−l","opencvphoto460","−l","opencvvideo460","−l","opencvvideoio460","−o","{fileBasenameNoExtension}.exe”
- “-fdiagnostics-color=always”,
其他库配置示例
根据前面的 opencv配置原理再来配置一下其他的库,这里选图形库raylib和数值计算库eigen
eigen
eigen 是一个通用数值计算库,体积小,全平台通用
eigen 编译
1. 下载安装
2. cmake build
3. 在build 文件下 make install 会编译安装到C:/program file(x86)/Eigen3
4. 注意如果权限不足需要先创建C:/program file(x86)/Eigen3
eigen 配置
根据前面的教程,如果为了方便eigen版本管理,可以直接把C:/program file(x86)/Eigen3/eigen
里面的所有文件剪切出来放到一个特定的地方,在c_cpp_properties.json 添加头文件路径。eigen有个特点,他只有头文件,没有任何静态或者动态链接,编译时只需要g++ tst.cpp -I PathTo/Eigen/include
即可。
但是有没有更简便的方法? 不修改c_cpp_properties.json, 也不要-I PathTo/Eigen/include
?
当然可以,tmdgcc的编译器内置头文件、库文件也有默认位置,只需要将eigen的头文件丢到PathTo/TDM-GCC64/include
中即可
注意我们通常引用的头文件如下
#include <iostream>
#include <Eigen/Dense>
using Eigen::MatrixXd;
using Eigen::VectorXd;int main()
{MatrixXd m = MatrixXd::Random(3,3);m = (m + MatrixXd::Constant(3,3,1.2)) * 50;std::cout << "m =" << std::endl << m << std::endl;VectorXd v(3);v << 1, 2, 3;std::cout << "m * v =" << std::endl << m * v << std::endl;
}
所有应该是把C:/program file(x86)/Eigen3/include/eigen3
下的两个目录Eigen
和 unsupported
copy到D:\ProEnv\TDM-GCC64\include
下
后续即可直接g++ 编译该程序
raylib
raylib 是通用的c++ 图像库全平台通用,你可以去raylib官网 看看教程,下载是免费的
编译安装
- 下载后是个 .exe文件 直接执行,他会把raylib解压到C:/raylib 下
- 到 C:/raylib/raylib/src 目录下打开终端,执行
make
即可,或者mingw32-make
- 真正有用的东西只有
raylib.h
与libraylib.a
这两个文件 - 编译时需要链接
-l raylib -l opengl32 -l gdi32 -l winmm
- 如果想对raylib进行有效管理,可以建立文件夹raylib,文件树如下
对于raylib我没有建立专门文件夹,而是把libraylib.a
丢到PathTo\TDM-GCC64\lib
中
把raylib.h
丢到PathTo\TDM-GCC\include
中
这两处是TDM-GCC64下可以直接查询的文件夹,所以不需要-I
和-L
指令
vscode 配置
根据之前的教程,同样可以修改c_cpp_properties 和task.json文件
但是如果该文件夹下有时候想用opencv,有时候想用raylib难道还要重新打开文件夹吗,其实可以在task.json中和launch.json中配置多个任务,这样在调试中就有多个选项,依旧可以一键运行这里附上我的配置
c_cpp_properties.json
{"configurations": [{"name": "Win32","includePath": ["${workspaceFolder}/**","D:/ProEnv/TDM-GCC64/lib/gcc/x86_64-w64-mingw32/10.3.0/include/c++","D:/ProEnv/TDM-GCC64/lib/gcc/x86_64-w64-mingw32/10.3.0/include/c++/tr1","D:/ProEnv/TDM-GCC64/lib/gcc/x86_64-w64-mingw32/10.3.0/include/c++/x86_64-w64-mingw32","D:/ProEnv/opencv460/include","D:/ProEnv/opencv460/include/opencv2"],"defines": ["_DEBUG","UNICODE","_UNICODE"],"windowsSdkVersion": "10.0.17763.0","compilerPath": "D:/ProEnv/TDM-GCC64/bin/g++.exe","cStandard": "c11","cppStandard": "c++11","intelliSenseMode": "gcc-x64"}],"version": 4
}
launch.json
{"version": "0.2.0","configurations": [{"name": "opencv gdb","type": "cppdbg","request": "launch","program": "${workspaceFolder}/${fileBasenameNoExtension}.exe","args": [],"stopAtEntry": false,"cwd": "${fileDirname}","environment": [],"externalConsole": true,"MIMode": "gdb","miDebuggerPath": "D:/ProEnv/TDM-GCC64/bin/gdb.exe","preLaunchTask": "opencv g++","setupCommands": [{"description": "Enable pretty-printing for gdb","text": "-enable-pretty-printing","ignoreFailures": true}]},{"name": "raylib gdb","type": "cppdbg","request": "launch","program": "${fileDirname}\\${fileBasenameNoExtension}.exe","args": [],"stopAtEntry": false,"cwd": "D:/ProEnv/TDM-GCC64/bin","environment": [],"externalConsole": false,"MIMode": "gdb","miDebuggerPath": "D:\\ProEnv\\TDM-GCC64\\bin\\gdb.exe","setupCommands": [{"description": "为 gdb 启用整齐打印","text": "-enable-pretty-printing","ignoreFailures": true},{"description": "将反汇编风格设置为 Intel","text": "-gdb-set disassembly-flavor intel","ignoreFailures": true}],"preLaunchTask": "raylib g++"},{"name": "ege gdb","type": "cppdbg","request": "launch","program": "${fileDirname}\\${fileBasenameNoExtension}.exe","args": [],"stopAtEntry": false,"cwd": "D:/ProEnv/TDM-GCC64/bin","environment": [],"externalConsole": false,"MIMode": "gdb","miDebuggerPath": "D:\\ProEnv\\TDM-GCC64\\bin\\gdb.exe","setupCommands": [{"description": "为 gdb 启用整齐打印","text": "-enable-pretty-printing","ignoreFailures": true},{"description": "将反汇编风格设置为 Intel","text": "-gdb-set disassembly-flavor intel","ignoreFailures": true}],"preLaunchTask": "ege g++"}]
}
setting.json
{"version": "0.2.0","configurations": [{"name": "(gdb) Launch", "type": "cppdbg", "request": "launch", "program": "${fileDirname}/${fileBasenameNoExtension}.exe", "args": [],"stopAtEntry": true,"editor.minimap.enabled": true,"C_Cpp.autocomplete": "Default","[cpp]": {"editor.quickSuggestions": true},"[c]": {"editor.quickSuggestions": true},"cwd": "${workspaceFolder}", "environment": [], "externalConsole": true, "internalConsoleOptions": true, "MIMode": "gdb", "miDebuggerPath": "gdb.exe", "setupCommands": [{"description": "Enable pretty-printing for gdb","text": "-enable-pretty-printing","ignoreFailures": false}],"preLaunchTask": "Compile" }],"cmake.configureOnOpen": false
}
task.json
{"version": "2.0.0","tasks": [{"label": "opencv g++","type": "cppbuild","command": "g++","args": ["-fdiagnostics-color=always","-g","${file}","-I","D:/ProEnv/opencv460/include","-L","D:/ProEnv/opencv460/bin","-l","opencv_calib3d460","-l","opencv_core460","-l","opencv_dnn460","-l","opencv_features2d460","-l","opencv_flann460","-l","opencv_gapi460","-l","opencv_highgui460","-l","opencv_imgcodecs460","-l","opencv_imgproc460","-l","opencv_ml460","-l","opencv_objdetect460","-l","opencv_stitching460","-l","opencv_photo460","-l","opencv_video460","-l","opencv_videoio460","-o","${fileBasenameNoExtension}.exe"],"problemMatcher": [],"group": {"kind": "test","isDefault": true}},{"type": "cppbuild","label": "raylib g++","command": "D:/ProEnv/TDM-GCC64/bin/g++.exe","args": ["-fdiagnostics-color=always","-g","${file}","-l","raylib","-l","opengl32","-l","gdi32", "-l","winmm","-o","${fileDirname}\\${fileBasenameNoExtension}.exe"],"options": {"cwd": "D:/ProEnv/TDM-GCC64/bin"},"problemMatcher": ["$gcc"],"group": "build","detail": "调试器生成的任务。"},{"type": "cppbuild","label": "ege g++","command": "D:/ProEnv/TDM-GCC64/bin/g++.exe","args": ["-fdiagnostics-color=always","-g","${file}","-l","graphics", "-l","uuid", "-l","msimg32", "-l","gdi32", "-l","imm32", "-l","ole32", "-l","oleaut32", "-l","winmm", "-l","gdiplus","-o","${fileDirname}\\${fileBasenameNoExtension}.exe"],"options": {"cwd": "D:/ProEnv/TDM-GCC64/bin"},"problemMatcher": ["$gcc"],"group": "build","detail": "调试器生成的任务。"}]
}
需要关注的是launch.json 中的 PreTask 的值一定与你的task.json的 label 的值对应
每个task.json中的args为编译时的参数
launch.json中的type必须为’cppdbg’ 这是vscode cpp 插件决定的
复制粘贴后有3个不同调试任务
里面的ege 是我自己安装了ege图形库,有兴趣可以自己安装验证一下
mingw 配置 opencv与vscode相关推荐
- 环境配置:Win10 - VSCode - MinGW64 - OpenCV 4.5.0 - ZBar 0.23.92
环境配置:Win10 - VSCode - MinGW64 - OpenCV 4.5.0 - ZBar 0.23.92 前言 1. VSCode 下载VSCode 安装 C/C++ 插件 项目配置 2 ...
- 【C++版Opencv】【Ubuntu】VScode配置Opencv
1 安装基本工具 sudo apt install -y g++ sudo apt install -y cmake sudo apt install -y make sudo apt install ...
- windows 11系统给clion配置opencv(含CMake下载及编译opencv、MinGW下载及编译opencv以及一些遇到的问题)
目录 一.CLion 2022.2.1下载与安装 二.下载opencv 4.4.0 三.下载及配置MinGW-w64GCC-8.1.0 1.下载MinGW 2.配置环境变量 四.下载CMake 3.2 ...
- Ubuntu20下 vscode配置OpenCV 4.5.5
一 安装依赖 sudo apt install -y g++ sudo apt install -y cmake sudo apt install -y make 二.安装opencv依赖的库 sud ...
- [OpenCV] -- win7下配置OpenCV的Qt开发环境
http://blog.csdn.net/qiurisuixiang/article/details/8665278 编译.配置OpenCV的工程相当曲折,编译OpenCV不下5次,一开始还以为是自己 ...
- QT配置opencv开发环境
0 编译.配置OpenCV的工程相当曲折,编译OpenCV不下5次,一开始还以为是自己的配置.编译步骤有问题,后来发现原来是自己电脑装的Qt Creator版本有点低,里面的MingW版本较低,而Op ...
- 配置OpenCV的Qt开发环境
QT&openCV系列!链接:http://www.cnblogs.com/emouse/category/449213.html 本文链接:http://blog.csdn.net/qiur ...
- vs code linux opencv,ubuntu+vscode 测试运行opencv
ubuntu+vscode 测试运行opencv ubuntu+vscode 测试运行opencv 之前再ubuntu配置好了opencv,今天测试运行一下. 1.创建一个文件夹opencv+test ...
- QT配置OpenCV(二):成功
前面使用MinGW在QT下配置OpenCV,不知是版本问题还是其他问题,放弃了,因为我不想重新装QT,太浪费时间了. 这次使用快乐配置OpenCV的方法. 先正常在QT中新建一个项目 然后右键项目名, ...
最新文章
- HTML5语音输入方法
- HttpClient 中文官方教程----第一章基础知识-只收录,未测试
- 数字货币 区块链 双花攻击 Double Spend Attack 简介
- opencv与两个摄像头实现双目标定与测距
- MySQL 数据库常用命令小结
- VTK:隐式函数之ImplicitSphere1
- Opencv中三种操作像素的方法
- 2021 年最值得了解的 Node.js 工具(下)
- 通过openpctv简单学习opkg安装与生成包的一些过程
- spark 不同模式用途_Spark 的四种模式
- Python 输出HTML实体字符(#x***转html,html符号乱码,中文乱码)
- Struts2源码学习(一)——Struts2中的XWork容器
- Selective Search for Object Recognition
- 发布npm包到GitHub Packages
- java 画金刚石_帮忙改错!java 画金刚石
- switch注意事项与在什么情况下使用switch或if语句
- Synopsys Mentor Candence
- 为什么牙齿上有白白的东西?
- 用ros输出hello,world(c++版)
- python3爬虫爬取网易云_【Python3爬虫】网易云音乐歌单下载
热门文章
- python用户登录系统编程思路_python编程思路
- 线性与非线性规划——单纯形法python实现
- 2021-08-02反省
- 基于springboot的网上摄影工作室网站-JAVA.VUE【数据库设计、开题报告】
- ThinkPHP 6.0.3版本自创标签方法
- 设计漂亮的样式表是一门艺术(译)
- 在国企的日子(第七章 转正)
- JavaScript BOM对象和DOM对象(DHTML)
- Java面向对象思想OOP理解 东海陈光剑 剑魔书仙读书录
- Pyecharts 风景名胜区数据可视化分析