Opencv C++ MinGW VSCode 编译致命错误
Opencv C++ MinGW VSCode fatal error to compile
大家好,我想使用 VSCode MinGW C++ 和 OpenCV 创建一个简单的 opencv 项目,但由于未知原因,出现此错误我该怎么办?
我想提一下,在 Visual studio 2017
作品中,我可以 运行 x64 架构上的 main.cpp。
下面的代码是我想要的 运行 在 VSCode 上的代码与我 运行 在 Visual Studio 2017 上的代码相同。
经过 10 天的尝试,我放弃 50 points
如果有人证明了这一点:
- 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 install opencv
生成了 opencv 库,我认为做得很好。
在我使用 vspkg
生成所有文件后,我使用 Visual Studio 2017 测试了所有文件并且可以正常工作,但我的主要目标是使用 VSCode
但是我不知道为什么会出现错误。
向您展示我已经生成了文件。
C:\vcpkg\installed\x64-windows\include
C:\vcpkg\installed\x64-windows\include\opencv2
C:\vcpkg\installed\x64-windows\lib
这里是在 MSYS2/mingw64 中设置 OpenCV 的说明。我帮不上忙 VsCode 但也许这会帮助你取得进步,或者帮助其他通过搜索找到这个问题的人。
您不需要自己实际构建 OpenCV;有用于 MinGW-w64 的预打包二进制文件。 MSYS2 的目的是提供 unix-style 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:
中使用以下命令编译了您的示例程序
g++ -o main main.cpp -std=c++17 -lopencv_core -lopencv_highgui -lopencv_imgcodecs -lopencv_imgproc
和运行程序成功。
请注意,您不需要为构建环境使用 MSYS2;如果您将包含和库路径设置为指向 MSYS2 的包管理器安装 headers 和库的位置,则可以从 Windows 命令提示符或任何其他 IDE 调用 g++
. (在 /mingw64/include/opencv*
和 /mingw64/lib
下,在 MSYS2 安装根目录下)。
安装 vcpkg(用于安装基于 windows 的开源项目的 MS 打包程序)并使用 powershell 命令 .\vcpkg install opencv:x64-windows-static
。将为您自动安装依赖库。
Opencv 可以使用 .\vcpkg integrate install
.
自动集成到您的 VS 项目中
我在 Windows 10 x64 上的 Visual Studio 代码中使用 MinGW-w64 g++ 尝试使用 OpenCV 3.4.1 构建并 运行 一个 C++ 程序成功。但我不知道这是否真的是“正确”的做法。
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
)
- 现在您已经可以使用 g++ 使用 CMD 构建程序,只需键入
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 代码打开你的 .cpp 文件,然后安装代码 运行ner 扩展 https://marketplace.visualstudio.com/items?itemName=formulahendry.code-runner,我使用代码 运行ner 轻松地 运行 我的程序。
- 在 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 代码 C/C+ + 扩展调试。您还可以将 "C:/OpenCV-MinGW-Build/include"
添加到 c_cpp_properties.json
包含路径以启用智能感知。如果您想使用另一个版本的 OpenCV,只需将 g++ 参数的所有 "341" 部分替换为另一个版本,例如使用 OpenCV 3.3.1 使用 -llibopencv_calib3d331
等等上。
编辑:我尝试编辑我的 tasks.json
和 launch.json
并且它与 gdb 调试器一起工作。
tasks.json
: https://gist.github.com/agtbaskara/4a2ec9a3a9a963069e719c0477185321
launch.json
: https://gist.github.com/agtbaskara/de04db8b6a31522dd1e62c43aa6e0f89
c_cpp_properties.json
: https://gist.github.com/agtbaskara/0eb773ac3085557baf7bf20b031fb49e
大家好,我想使用 VSCode MinGW C++ 和 OpenCV 创建一个简单的 opencv 项目,但由于未知原因,出现此错误我该怎么办?
我想提一下,在 Visual studio 2017
作品中,我可以 运行 x64 架构上的 main.cpp。
下面的代码是我想要的 运行 在 VSCode 上的代码与我 运行 在 Visual Studio 2017 上的代码相同。
经过 10 天的尝试,我放弃 50 points
如果有人证明了这一点:
- 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 install opencv
生成了 opencv 库,我认为做得很好。
在我使用 vspkg
生成所有文件后,我使用 Visual Studio 2017 测试了所有文件并且可以正常工作,但我的主要目标是使用 VSCode
但是我不知道为什么会出现错误。
向您展示我已经生成了文件。
C:\vcpkg\installed\x64-windows\include
C:\vcpkg\installed\x64-windows\include\opencv2
C:\vcpkg\installed\x64-windows\lib
这里是在 MSYS2/mingw64 中设置 OpenCV 的说明。我帮不上忙 VsCode 但也许这会帮助你取得进步,或者帮助其他通过搜索找到这个问题的人。
您不需要自己实际构建 OpenCV;有用于 MinGW-w64 的预打包二进制文件。 MSYS2 的目的是提供 unix-style 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:
中使用以下命令编译了您的示例程序g++ -o main main.cpp -std=c++17 -lopencv_core -lopencv_highgui -lopencv_imgcodecs -lopencv_imgproc
和运行程序成功。
请注意,您不需要为构建环境使用 MSYS2;如果您将包含和库路径设置为指向 MSYS2 的包管理器安装 headers 和库的位置,则可以从 Windows 命令提示符或任何其他 IDE 调用 g++
. (在 /mingw64/include/opencv*
和 /mingw64/lib
下,在 MSYS2 安装根目录下)。
安装 vcpkg(用于安装基于 windows 的开源项目的 MS 打包程序)并使用 powershell 命令 .\vcpkg install opencv:x64-windows-static
。将为您自动安装依赖库。
Opencv 可以使用 .\vcpkg integrate install
.
我在 Windows 10 x64 上的 Visual Studio 代码中使用 MinGW-w64 g++ 尝试使用 OpenCV 3.4.1 构建并 运行 一个 C++ 程序成功。但我不知道这是否真的是“正确”的做法。 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
) - 现在您已经可以使用 g++ 使用 CMD 构建程序,只需键入
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 代码打开你的 .cpp 文件,然后安装代码 运行ner 扩展 https://marketplace.visualstudio.com/items?itemName=formulahendry.code-runner,我使用代码 运行ner 轻松地 运行 我的程序。
- 在 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 代码 C/C+ + 扩展调试。您还可以将 "C:/OpenCV-MinGW-Build/include"
添加到 c_cpp_properties.json
包含路径以启用智能感知。如果您想使用另一个版本的 OpenCV,只需将 g++ 参数的所有 "341" 部分替换为另一个版本,例如使用 OpenCV 3.3.1 使用 -llibopencv_calib3d331
等等上。
编辑:我尝试编辑我的 tasks.json
和 launch.json
并且它与 gdb 调试器一起工作。
tasks.json
: https://gist.github.com/agtbaskara/4a2ec9a3a9a963069e719c0477185321
launch.json
: https://gist.github.com/agtbaskara/de04db8b6a31522dd1e62c43aa6e0f89
c_cpp_properties.json
: https://gist.github.com/agtbaskara/0eb773ac3085557baf7bf20b031fb49e