首页 文章

Opencv C MinGW VSCode编译致命错误

提问于
浏览
6

大家好我想用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 工作,但我没有任何线索,为什么我得到错误 .

告诉你我已经生成了文件 .

C:\ vcpkg \ installed \ x64-windows \ include

enter image description here

C:\ vcpkg \ installed \ x64-windows \ include \ opencv2

enter image description here

C:\ vcpkg \ installed \ x64-windows \ lib

enter image description here

3 回答

  • 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.jsonlaunch.json ,它适用于gdb调试器 . tasks.jsonhttps://gist.github.com/agtbaskara/4a2ec9a3a9a963069e719c0477185321 launch.jsonhttps://gist.github.com/agtbaskara/de04db8b6a31522dd1e62c43aa6e0f89 c_cpp_properties.jsonhttps://gist.github.com/agtbaskara/0eb773ac3085557baf7bf20b031fb49e

  • 2

    以下是在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中使用以下命令编译了您的示例程序:

    g++ -o main main.cpp -std=c++17 -lopencv_core -lopencv_highgui -lopencv_imgcodecs -lopencv_imgproc
    

    并成功运行程序 .


    请注意,您不需要将MSYS2用于构建环境;如果设置Include和Library路径指向MSYS2的程序包管理器安装标头和库的位置,则可以从Windows命令提示符或任何其他IDE调用 g++ . (在MSYS2安装根目录下的 /mingw64/include/opencv*/mingw64/lib 下) .

  • 1

    安装vcpkg(MS packager以安装Windows基于开源项目)并使用powershell命令 .\vcpkg install opencv:x64-windows-static . 将自动为您安装依赖库 .

    可以使用 .\vcpkg integrate install 将Opencv自动集成到VS项目中 .

相关问题