大家好我想用VSCode MinGW C和OpenCV来创建一个简单的opencv项目,但由于未知原因,我得到这个错误我该怎么办?
我想提一下,在Visual Studio 2017中,我可以在x64架构上运行main.cpp .
我想在VSCode上运行的代码与我在Visual Studio 2017上运行的代码相同 .
经过10天的尝试,如果有人证明以下情况,我会放弃50分:
-
VSCODE
-
C 17
-
Opencv
在Windows 10 x64架构上
一个成功的构建 .
src / main.cpp
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main() {
Mat image;
image = imread("./22.png", IMREAD_COLOR); // Read the file
namedWindow("Display window", WINDOW_AUTOSIZE); // Create a window for display.
if (!image.data) // Check for invalid input
{
cout << "Could not open or find the image" << std::endl;
} else { // Image is good!
imshow("Display window", image); // Show our image inside it.
}
waitKey(0);
return 0;
}
在我的VSCode编辑器中,我尝试使用tasks.json和 CTRL + SHIFT + B
构建应用程序
tasks.json
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "echo",
"type": "shell",
"command": "",
"args": [
"g++",
"-I", "C:\\vcpkg\\installed\\x64-windows\\include",
"-L", "C:\\vcpkg\\installed\\x64-windows\\lib",
"./src/main.cpp",
"-lopencv_core341",
"-lopencv_highgui341",
"-o app"
],
"group": {
"kind": "build",
"isDefault": true
}
}
]
}
c_cpp_properties.json
{
"configurations": [
{
"name": "Win32",
"includePath": [
"${workspaceFolder}/**",
"${workspaceFolder}/src",
"C:/vcpkg/installed/x64-windows/include",
"C:/vcpkg/installed/x64-windows/lib"
],
"browse": {
"path": [
],
"limitSymbolsToIncludedHeaders": true
},
"defines": [
"_DEBUG",
"UNICODE",
"_UNICODE"
],
"windowsSdkVersion": "10.0.17134.0",
"compilerPath": "C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Tools/MSVC/14.14.26428/bin/Hostx64/x64/cl.exe",
"cStandard": "c11",
"cppStandard": "c++17",
"intelliSenseMode": "msvc-x64",
"C_Cpp.intelliSenseEngine": "Tag Parser"
}
],
"version": 4
}
我得到了这个错误
> Executing task: g++ main.cpp -I C:/vcpkg/installed/x64-windows/include -L C:/vcpkg/installed/x64-windows/lib -lopencv_core341 -lopencv_highgui341 -o app <
C:\Users\giorg\AppData\Local\Temp\ccNFIHQq.o:main.cpp:(.text+0x51): undefined reference to `cv::imread(cv::String const&, int)'
C:\Users\giorg\AppData\Local\Temp\ccNFIHQq.o:main.cpp:(.text+0xa2): undefined reference to `cv::namedWindow(cv::String const&, int)'
C:\Users\giorg\AppData\Local\Temp\ccNFIHQq.o:main.cpp:(.text+0x119): undefined reference to `cv::imshow(cv::String const&, cv::_InputArray const&)'
C:\Users\giorg\AppData\Local\Temp\ccNFIHQq.o:main.cpp:(.text+0x139): undefined reference to `cv::waitKey(int)'
C:\Users\giorg\AppData\Local\Temp\ccNFIHQq.o:main.cpp:(.text$_ZN2cv6StringC1EPKc[__ZN2cv6StringC1EPKc]+0x42): undefined reference to `cv::String::allocate(unsigned int)'
C:\Users\giorg\AppData\Local\Temp\ccNFIHQq.o:main.cpp:(.text$_ZN2cv6StringD1Ev[__ZN2cv6StringD1Ev]+0xf): undefined reference to `cv::String::deallocate()'
C:\Users\giorg\AppData\Local\Temp\ccNFIHQq.o:main.cpp:(.text$_ZN2cv3MatD1Ev[__ZN2cv3MatD1Ev]+0x2d): undefined reference to `cv::fastFree(void*)'
C:\Users\giorg\AppData\Local\Temp\ccNFIHQq.o:main.cpp:(.text$_ZN2cv3Mat7releaseEv[__ZN2cv3Mat7releaseEv]+0x40): undefined reference to `cv::Mat::deallocate()'
C:\Users\giorg\AppData\Local\Temp\ccNFIHQq.o:main.cpp:(.text$_ZN2cv3MataSEOS0_[__ZN2cv3MataSEOS0_]+0xb4): undefined reference to `cv::fastFree(void*)'
collect2.exe: error: ld returned 1 exit status
The terminal process terminated with exit code: 1
Terminal will be reused by tasks, press any key to close it.
我使用 vcpkg
使用 vcpkg
生成了opencv库,我认为这样做非常好 .
使用 vspkg
生成所有文件后,我使用Visual Studio 2017测试所有文件并且正常工作,但我的主要目标是使用 VSCode
工作,但我没有任何线索,为什么我得到错误 .
告诉你我已经生成了文件 .
3 回答
我尝试使用Windows 10 x64上的Visual Studio Code中的MinGW-w64 g在OpenCV 3.4.1中构建和运行C程序 . 但我不知道这是否真的是"right"这样做的方式 . Screenshot
下载并安装MinGW-w64选择
x86_64-8.1.0-posix-seh-rt_v6-rev0
版本或更新http://mingw-w64.org/doku.php/start .打开CMD并转到C:\然后克隆此repo https://github.com/huihut/OpenCV-MinGW-Build然后检出
OpenCV-3.4.1-x64
分支或只执行此git clone https://github.com/huihut/OpenCV-MinGW-Build.git -b OpenCV-3.4.1-x64
将Mingw-w64 bin文件夹添加到系统路径(对我来说路径是
C:\Program Files\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\bin
)将先前克隆的OpenCV mingw bin文件夹添加到系统路径(对我来说路径是
C:\OpenCV-MinGW-Build\x64\mingw\bin
)现在你已经可以使用CM使用g构建一个程序只需键入
g++ test.cpp -IC:\OpenCV-MinGW-Build\include -LC:\OpenCV-MinGW-Build\x64\mingw\bin -llibopencv_calib3d341 -llibopencv_core341 -llibopencv_dnn341 -llibopencv_features2d341 -llibopencv_flann341 -llibopencv_highgui341 -llibopencv_imgcodecs341 -llibopencv_imgproc341 -llibopencv_ml341 -llibopencv_objdetect341 -llibopencv_photo341 -llibopencv_shape341 -llibopencv_stitching341 -llibopencv_superres341 -llibopencv_video341 -llibopencv_videoio341 -llibopencv_videostab341
只需将test.cpp
更改为.cpp文件名即可 .使用Visual Studio Code打开.cpp文件,然后安装Code Runner扩展https://marketplace.visualstudio.com/items?itemName=formulahendry.code-runner,我使用Code Runner轻松运行我的程序 .
在Visual Studio代码中按
Ctrl + comma
然后搜索"code-runner.executorMap":
并将"cpp:"
条目上的内容更改为"cd $dir && g++ $fileName -o $fileNameWithoutExt -IC:/OpenCV-MinGW-Build/include -LC:/OpenCV-MinGW-Build/x64/mingw/bin -llibopencv_calib3d341 -llibopencv_core341 -llibopencv_dnn341 -llibopencv_features2d341 -llibopencv_flann341 -llibopencv_highgui341 -llibopencv_imgcodecs341 -llibopencv_imgproc341 -llibopencv_ml341 -llibopencv_objdetect341 -llibopencv_photo341 -llibopencv_shape341 -llibopencv_stitching341 -llibopencv_superres341 -llibopencv_video341 -llibopencv_videoio341 -llibopencv_videostab341 && $dir$fileNameWithoutExt",
,您可以将其应用于用户设置或仅用于工作区设置 . `之后只需按
Ctrl+Alt+N
即可构建并运行程序或只需按播放按钮即可 .我相信你也可以通过将
-IC:\OpenCV-MinGW-Build\include ..
添加到args
部分来将其应用于tasks.json
以使用Visual Studio Code C / C扩展调试 . 您还可以将"C:/OpenCV-MinGW-Build/include"
添加到c_cpp_properties.json
include路径以启用智能感知 . 如果你想使用另一个版本的OpenCV,只需将g参数的所有 "341" 部分替换为另一个版本,例如使用OpenCV 3.3.1使用-llibopencv_calib3d331
等等 .编辑:我已经尝试编辑我的
tasks.json
和launch.json
,它适用于gdb调试器 .tasks.json
:https://gist.github.com/agtbaskara/4a2ec9a3a9a963069e719c0477185321launch.json
:https://gist.github.com/agtbaskara/de04db8b6a31522dd1e62c43aa6e0f89c_cpp_properties.json
:https://gist.github.com/agtbaskara/0eb773ac3085557baf7bf20b031fb49e以下是在MSYS2 / mingw64中设置OpenCV的说明 . 我无法帮助VsCode,但这可能会帮助你取得进步,或帮助其他通过搜索找到这个问题的人 .
您不需要自己实际构建OpenCV; MinGW-w64有预先打包的二进制文件 . MSYS2的目的是提供一个unix风格的shell并充当包管理器 . 如果您之前没有使用过MSYS2:
Install MSYS2 and update to latest as shown here .
打开MSYS2 / mingw64 shell(不是MSYS2 / msys2 shell) . 在此shell中构建的二进制文件将作为独立的Windows二进制文件运行,它们不依赖于MSYS2环境 .
测试
g++
的工作原理 .然后你可以添加OpenCV:
pacman -Ss mingw64/mingw-w64-x86_64-opencv
它已经准备好了 . 我在MSYS2 shell中使用以下命令编译了您的示例程序:
并成功运行程序 .
请注意,您不需要将MSYS2用于构建环境;如果设置Include和Library路径指向MSYS2的程序包管理器安装标头和库的位置,则可以从Windows命令提示符或任何其他IDE调用
g++
. (在MSYS2安装根目录下的/mingw64/include/opencv*
和/mingw64/lib
下) .安装vcpkg(MS packager以安装Windows基于开源项目)并使用powershell命令
.\vcpkg install opencv:x64-windows-static
. 将自动为您安装依赖库 .可以使用
.\vcpkg integrate install
将Opencv自动集成到VS项目中 .