g++环境搭建

暂时采用VsCode与g++环境做基础测试,g++编译器采用mingw。

现在发现sourceforge好像没有挂载mingw下载了,或者我找不到入口,还是找到一个项目可以下载: mingw下载,一般的C++项目posix或win32都无所谓,其差别在于多线程环境,但是OpenCV建议线程模式是posix,那就听劝,我下载的是2022.8.22的x86_64-12.2.0-release-posix-seh-rt_v10-rev0.7z,其他版本自行甄别。

解压,将文件夹的bin目录加入环境变量,Vscode搜C++/C配置Ui,配置对应的编译器路径(为了生成c_cpp_properties.json),搜task选择编译器任务(为了生成task.json),就能得到VsCode编译C++环境。(这部分以前没有接触过的建议CSDN查详情)。

验证:cmd输入g++ -v会输出对应编译器信息,或者验证VsCode是否能够正常编译代码。

OpenCV环境

对mingw和VsCode而言OpenCV需要自己用cmake编译,而如果是Visual Studio则直接下载官方编译好的库即可,现在采用前者,后者日后用到再补充。环境和附链如下:

  • posix mingw 12.2.0 、VsCode、Win10

  • OpenCV 4.5.5 :下载Sourcode压缩包

  • cmake 3.27.3:下载对应msi,无需手动配置环境变量

cmake编译OpenCV

下载好的SourceCode放置在合适位置解压,新建build文件夹暂存编译文件,打开cmake,源文件夹就是SourceCode,目的文件夹是build文件夹,点击Configure选择mingw bin文件夹下的gcc、g++作为编译器。 编译配置

等待几分钟,等待配置项完成,按需求勾选,目前没什么特别需求,只有一个Qt,选择了WITH_OpenGL、WITH_QT;

点击ConfigureGenerate会生成对应的Makefile文件和相关依赖,部分依赖可能下载失败,查看CMakeDownloadLog.txt日志,docopy中出现的github打开,并且下载对应的文件放到提示文件夹,我这里遇到的不算多,只下载opencv_videoio_ffmpeg.dll等动态库。

于是开始cmake:

1
mingw32-make -j 8  #根据CPU数目改改数字,耗时几分钟——十几分钟不等
按版本来应该不会报错,本方法在两台设备进行过验证,接下来安装即可:
1
mingw32-make install

测试程序

为了验证OpenCV是能用的,参考以下测试方法,保持耐心。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include<opencv2/opencv.hpp>

using namespace std;

int main(){
cout<<"Hello WORLD"<<endl;
cv::Mat srcImage = cv::imread("C:/Users/24364/C_git/opencv_test/test.jpg");

//imshow输出可调节窗口
//cv::namedWindow("srcImage", cv::WINDOW_NORMAL);
cv::imshow("srcImage", srcImage);

cv::waitKey(0); //按下才退出进程,防止闪图
return 0;
}

在bash环境链接库需要-I头文件、-L库文件、-l动态库文件,VsCode这里貌似没有一个环境变量解决这些问题,那还是按原理来吧。首先要让编译器包含头文件,在c_cpp_properties.json加入:

1
2
3
4
"includePath": [
"${workspaceFolder}/**",
"F:\\opencv-4.5.5\\build\\install\\include", //加入头文件路径
],
在task.json补全:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
"args": [
"-fdiagnostics-color=always", //默认编译参数
"-g",
"${file}",
"-o",
"${fileDirname}\\${fileBasenameNoExtension}.exe",
"-I", //头文件
"F:\\opencv-4.5.5\\build\\install\\include",
"-L", //库文件
"F:\\opencv-4.5.5\\build\\install\\x64\\mingw\\lib",
"-lopencv_core455", //具体动态库,不同程序需求不同
"-lopencv_imgproc455",
"-lopencv_highgui455",
"-lopencv_imgcodecs455"
],
最后将install/x64/mingw/bin目录添加到环境变量(注意不是外面的bin目录,一定是mingw下的);

至此F5能够运行上述CV程序了,其他的日后探讨。效果: 运行效果

Q&A

  1. 编译时出现could not convert template argument......
  • 在尝试OpenCV 4.8时编译出错,一说是mingw和Opencv版本不匹配,遂改用OpenCV 4.5.5;
  1. 运行代码提示undefined reference to ‘cv::Mat::Mat()
  • undefined reference类错误大多数指向动态库链接失败导致类型错误,首先确保库路径、头文件路径没有报错,其次确定动态库文件名称正确,有的版本动态库文件名是-lopencv_imgproc.dll.a,那么上面就没有455了。
  1. 代码运行无报错,但调试报错Unable to start debugging. Unexpected GDB output from command “-exec-run”,或者计算机重启遇到此问题
  • 环境变量没有配置好,按原文描述配置。

参考链接:

  1. https://blog.csdn.net/NeoZng/article/details/122778711

  2. https://www.cnblogs.com/mrlonely2018/p/14889254.html

  3. https://blog.csdn.net/qq_45461410/article/details/132109155