双目测距实战1-环境配置
我们将采用目前最稳定、最推荐的方法:使用 MSYS2 和 MinGW-w64 工具链。这种方法可以避免很多手动配置的麻烦和编译器不兼容的问题。
整体流程概览
- 安装 VS Code 和 C/C++ 插件 (如果你还没有)
- 安装 MSYS2 包管理器
- 通过 MSYS2 安装 MinGW-w64 C++ 编译器和相关工具 (如
g++
,make
,gdb
) - 通过 MSYS2 安装 OpenCV (这是关键,它会自动处理依赖和路径)
- 配置 Windows 环境变量
- 在 VS Code 中配置项目 (包含
c_cpp_properties.json
,tasks.json
,launch.json
三个核心文件) - 编写、编译和运行一个简单的 OpenCV 程序
第一步:安装 VS Code 及 C/C++ 插件
如果你已经安装好了,可以跳过此步。
- 下载 VS Code: 前往 VS Code 官网 下载并安装。
- 安装 C/C++ 插件:
- 打开 VS Code。
- 点击左侧边栏的扩展图标 (Extensions)。
- 搜索 “C/C++”。
- 选择 Microsoft 提供的 “C/C++” 扩展,点击 Install。
第二步:安装 MSYS2
MSYS2 是一个在 Windows 上的软件分发和构建平台,它提供了一个强大的包管理器 pacman
,可以非常方便地安装开发工具和库。
- 下载 MSYS2: 前往 MSYS2 官网,下载
.exe
安装程序。 - 安装 MSYS2:
- 运行安装程序,建议保持默认安装路径
C:\msys64
。 - 安装完成后,不要立即关闭窗口,勾选 “Run MSYS2 now”。
- 运行安装程序,建议保持默认安装路径
MinGW-w64 vs. MSYS2
MinGW-w64:指的是编译器工具链本身(g++.exe, gdb.exe ****等)。它就像汽车的“引擎”。
MSYS2:是一个软件分发平台和命令行环境。它提供了一个强大的包管理器 pacman 和一个 bash ****shell 环境。它负责下载、安装、管理和更新 MinGW-w64 这个“引擎”。
关系就是:MSYS2 是一个“汽车工厂”,而 MinGW-w64 是这个工厂生产和使用的“引擎”。 你通过工厂的系统(pacman)订购了 ucrt64 型号的引擎(mingw-w64-ucrt-x86_64-toolchain)。
第三步:通过 MSYS2 安装 MinGW-w64 编译器工具链
- 打开 MSYS2 终端: 你会看到一个类似 Linux 终端的窗口。
- 修改镜像源
echo 'Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/msys/$arch' > /etc/pacman.d/mirrorlist.msys
echo 'Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/i686' > /etc/pacman.d/mirrorlist.mingw32
echo 'Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/ucrt64' > /etc/pacman.d/mirrorlist.ucrt64
- 更新包数据库和基础包: 运行以下命令。这个过程可能需要关闭窗口并重新打开,请按照终端的提示操作。
pacman -Syu
如果提示关闭,请关闭窗口,然后从开始菜单找到 “MSYS2 UCRT64” 重新打开,再次运行 pacman -Syu
直到提示 “there is nothing to do”。
- 安装 MinGW-w64 工具链: 这会安装
g++
(编译器),gdb
(调试器),make
等所有必要的工具。
pacman -S --needed base-devel mingw-w64-ucrt-x86_64-toolchain
当提示选择时,按 Enter 键默认安装全部。
第四步:通过 MSYS2 安装 OpenCV
这是最关键的一步。使用 pacman
安装可以确保 OpenCV 是用与你刚刚安装的 g++
相同的编译器编译的,避免了库不兼容的问题。
- 搜索 OpenCV 包:
pacman -Ss opencv
- 安装 OpenCV 和 pkg-config:
pkg-config
是一个帮助我们自动获取编译和链接标志的工具,非常有用。
pacman -S mingw-w64-ucrt-x86_64-opencv
pacman -Ql mingw-w64-ucrt-x86_64-opencv | grep opencv4.pc #验证安装
pacman -S mingw-w64-ucrt-x86_64-qt6 #安装Qt
第五步:配置 Windows 环境变量
为了让系统和 VS Code 能找到 g++
等命令和 OpenCV 运行时所需的 DLL 文件,需要将 MinGW-w64 的 bin
目录添加到系统的 Path
环境变量中。
- 在 Windows 搜索框中搜索 “环境变量”,然后点击 “编辑系统环境变量”。
- 在弹出的窗口中,点击 “环境变量…” 按钮。
- 在 “系统变量” 区域,找到并双击
Path
。 - 点击 “新建”,然后添加 MinGW-w64 的
bin
目录的路径。如果你的 MSYS2 安装在C:\msys64
,那么路径就是:
C:\msys64\ucrt64\bin
- 一路点击 “确定” 保存。
- 验证安装: 打开一个新的
cmd
或PowerShell
窗口(必须是新的),输入以下命令进行验证:
g++ --version
gdb --version
如果能正确显示版本号,说明环境变量配置成功。
第六步:在 VS Code 中配置项目
现在,我们来创建一个项目并配置 VS Code 来编译和运行 OpenCV 代码。
- 创建项目文件夹: 在你喜欢的位置创建一个文件夹,例如
D:\Projects\OpenCV_Test
。 - 用 VS Code 打开文件夹: 打开 VS Code,通过
File > Open Folder...
打开你刚刚创建的文件夹。 - 创建源文件: 在 VS Code 中新建一个文件,命名为
main.cpp
,并粘贴以下测试代码。
#include <iostream>
#include <opencv2/opencv.hpp>int main() {// 读取图片cv::Mat image = cv::imread("test.jpg");// 检查图片是否成功加载if (image.empty()) {std::cout << "Could not open or find the image!" << std::endl;return -1;}// 创建一个窗口cv::namedWindow("Display window", cv::WINDOW_AUTOSIZE);// 在窗口中显示图片cv::imshow("Display window", image);// 等待按键,然后关闭窗口cv::waitKey(0);return 0;
}
- **注意**: 你需要准备一张名为 `test.jpg` 的图片,并把它放在项目文件夹 `OpenCV_Test` 中。
- 配置 VS Code 任务:
现在,我们需要告诉 VS Code 如何编译和运行我们的代码。VS Code 通过.vscode
文件夹下的json
文件来管理这些配置。- 按
Ctrl+Shift+P
打开命令面板,输入C/C++: Edit Configurations (UI)
并回车。这会自动生成一个.vscode
文件夹和c_cpp_properties.json
文件。 - 配置
c_cpp_properties.json
(管编辑):
将文件内容修改为如下。这个文件告诉 VS Code 在哪里寻找头文件。
- 按
{"configurations": [{"name": "Win32","includePath": ["${workspaceFolder}/**","C:/msys64/ucrt64/include/**" ],"defines": ["_DEBUG","UNICODE","_UNICODE"],"compilerPath": "C:/msys64/ucrt64/bin/g++.exe","cStandard": "c17","cppStandard": "c++17","intelliSenseMode": "windows-gcc-x64"}],"version": 4
}
* **关键点**: `includePath` 中包含了 `C:/msys64/ucrt64/include/**`,这样 VS Code 就能找到 `opencv2` 的头文件了。
- **配置 **`tasks.json`** (用于编译)**:
{"version": "2.0.0","tasks": [{// 这是我们唯一需要的、正确的编译任务"label": "build opencv project with MinGW","type": "shell","command": "g++ -g \"${file}\" -o \"${fileDirname}/${fileBasenameNoExtension}.exe\" $(pkg-config --cflags --libs opencv4 Qt6Core )","options": {"env": {"PKG_CONFIG_PATH": "C:/msys64/ucrt64/lib/pkgconfig","PATH": "C:/msys64/ucrt64/bin;C:/msys64/usr/bin;${env:PATH}"},"shell": {"executable": "C:/msys64/usr/bin/bash.exe","args": ["-c"]}},"problemMatcher": ["$gcc"],// ▼▼▼ 把 isDefault: true 加到这里 ▼▼▼"group": {"kind": "build","isDefault": true}}// 那个错误的、自动生成的任务已经被我们删除了]
}
* 按 `Ctrl+Shift+P`,输入 `Tasks: Configure Default Build Task` 并回车。* 选择 `C/C++: g++.exe build active file`。这会生成一个 `tasks.json` 文件。* 用下面的内容**完全替换** `tasks.json` 文件。* **关键点**: `$(pkg-config --cflags --libs opencv4)` 这部分是精髓!它会自动执行 `pkg-config` 命令,生成所有必需的 `-I` (包含路径), `-L` (库路径) 和 `-l` (链接库) 参数。这避免了手动去写一长串 ` -lopencv_core455 -lopencv_highgui455 ...`,既易错又麻烦。
- **配置 **`launch.json`** (用于运行和调试)**:
{"version": "0.2.0","configurations": [{"name": "Run OpenCV with GDB","type": "cppdbg","request": "launch","program": "${fileDirname}/${fileBasenameNoExtension}.exe","args": [],"stopAtEntry": false,"cwd": "${workspaceFolder}","environment": [{"name": "Path","value": "C:/msys64/ucrt64/bin;${env:Path}"}],"externalConsole": false,"MIMode": "gdb","miDebuggerPath": "C:/msys64/ucrt64/bin/gdb.exe","setupCommands": [{"description": "Enable pretty-printing for gdb","text": "-enable-pretty-printing","ignoreFailures": true}],"preLaunchTask": "build opencv project with MinGW"}]
}
* 点击 VS Code 左侧的 "Run and Debug" 图标。* 点击 "create a launch.json file",然后选择 `C++ (GDB/LLDB)`。* 选择 `g++.exe build and debug active file`。* 用下面的内容**完全替换** `launch.json` 文件。* **关键点**: `program` 指向我们编译生成的可执行文件。`miDebuggerPath` 指向 GDB 调试器。`preLaunchTask` 确保在每次调试前都会先运行我们在 `tasks.json` 中定义的构建任务。
第七步:编译和运行
现在,所有配置都已完成!
- 编译:
- 确保你的
main.cpp
文件是当前打开并激活的。 - 按下
Ctrl+Shift+B
,这会触发你在tasks.json
中定义的默认构建任务。 - VS Code 的终端会显示编译过程。如果没有错误,你会在项目文件夹下看到一个
main.exe
文件。
- 确保你的
- 运行和调试:
- 按下
F5
键或者左边Debug按钮 - VS Code 会先执行编译任务,然后启动调试器运行
main.exe
。 - 如果一切顺利,你会看到一个标题为 “Display window” 的窗口弹出,并显示你的
test.jpg
图片!
- 按下
常见问题排查 (Troubleshooting)
- 错误: “undefined reference to
cv::imread(std::string const&, int)
”- 原因: 这是链接错误,意味着编译器找到了头文件但找不到库文件。
- 解决:
- 确保
tasks.json
中的$(pkg-config --cflags --libs opencv4)
部分正确无误。 - 打开一个 MSYS2 UCRT64 终端,手动运行
pkg-config --cflags --libs opencv4
,看看是否能输出一长串-I... -L... -l...
参数。如果不能,说明pkg-config
或 OpenCV 安装有问题。
- 确保
- 错误: “opencv2/opencv.hpp: No such file or directory”
- 原因: 编译器找不到头文件。
- 解决:
- 检查
c_cpp_properties.json
中的"includePath"
是否正确指向了C:/msys64/ucrt64/include/**
。 - 检查
tasks.json
,确保pkg-config
命令正常工作。
- 检查
- 程序启动后闪退,或者提示找不到
libopencv_core-4.dll
之类的文件- 原因: 运行时找不到 OpenCV 的动态链接库 (DLL)。
- 解决: 这是环境变量
Path
没有配置正确。确保C:\msys64\ucrt64\bin
已经添加到了系统Path
中,并且你已经重启了 VS Code 或电脑。
恭喜你!现在你已经拥有一个功能完备的、基于 VS Code 和 MinGW-w64 的 OpenCV C++ 开发环境了。