【问题标题】:Opencv C++ MinGW VSCode fatal error to compileOpencv C++ MinGW VSCode 致命错误编译
【发布时间】:2018-07-31 21:09:09
【问题描述】:

大家好,我想使用 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 编辑器中,我尝试使用带有 CTRL + SHIFT + B 的 tasks.json 构建应用程序

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

【问题讨论】:

  • 您可能需要 MinGW 二进制文件而不是 Visual Studio 二进制文件。
  • 以及如何使用 MinGW 二进制文件,您能描述一下您的解决方案吗?谢谢
  • 所有教程都已过时这很可能无关紧要。 CMake 的 GUI 多年来并没有真正改变太多。
  • 我该怎么办?复制 .lib 文件和 minGW 目录中的所有包含目录,如果是,在哪里?
  • 这可能会有所帮助:github.com/huihut/OpenCV-MinGW-Build

标签: c++ opencv visual-studio-code mingw


【解决方案1】:

我成功地尝试在 Windows 10 x64 上的 Visual Studio Code 中使用 MinGW-w64 g++ 构建和运行带有 OpenCV 3.4.1 的 C++ 程序。但我不知道这是否真的是“正确”的做法。 Screenshot


  1. 下载并安装 MinGW-w64 选择x86_64-8.1.0-posix-seh-rt_v6-rev0 或更新版本http://mingw-w64.org/doku.php/start
  2. 打开 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
  3. 将 Mingw-w64 bin 文件夹添加到系统路径(我的路径是C:\Program Files\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\bin
  4. 将之前克隆的 OpenCV mingw bin 文件夹添加到系统路径(对我来说路径是C:\OpenCV-MinGW-Build\x64\mingw\bin
  5. 现在您已经可以使用 CMD 使用 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 文件名。
  6. 使用 Visual Studio Code 打开您的 .cpp 文件,然后安装 Code Runner 扩展 https://marketplace.visualstudio.com/items?itemName=formulahendry.code-runner,我使用 Code Runner 轻松运行我的程序。
  7. 在 Visual Studio Code 中按Ctrl + comma,然后搜索"code-runner.executorMap": 并将"cpp:" 条目上的内容更改为"cd $dir &amp;&amp; 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 &amp;&amp; $dir$fileNameWithoutExt",,您可以将其应用于用户设置或仅用于工作区设置。 `
  8. 之后,只需按 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 包含路径以启用智能感知。如果您想使用其他版本的 OpenCV,只需将 g++ 参数的所有 "341" 部分替换为其他版本,例如使用 OpenCV 3.3.1 使用 -llibopencv_calib3d331 等等。


编辑:我尝试编辑我的tasks.jsonlaunch.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

【讨论】:

  • 你的答案正是我想要的。
【解决方案2】:

这里是在 MSYS2/mingw64 中设置 OpenCV 的说明。我对 VsCode 无能为力,但也许这会帮助您取得进步,或帮助其他通过搜索找到此问题的人。


您不需要自己实际构建 OpenCV; MinGW-w64 有预打包的二进制文件。 MSYS2 的目的是提供一个 unix 风格的 shell 并充当包管理器。如果您之前没有使用过 MSYS2:

  1. Install MSYS2 and update to latest as shown here
  2. 打开 MSYS2/mingw64 shell(不是 MSYS2/msys2 shell)。在这个 shell 中构建的二进制文件将作为独立的 Windows 二进制文件运行,它们不依赖于 MSYS2 环境。
  3. 测试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 下)。

【讨论】:

  • 嗨,MM,您已经设法让它在您的 Windows x64 机器上运行?
  • 这是错误&gt; Executing task: g++ -std=c++17 -W -p -g main.cpp -I C:\msys64\mingw64\include -L C:\msys64\mingw64\lib -libopencv_core -libopencv_highgui -lopencv_imgcodecs -lopencv_imgproc -o app &lt;`C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/8.2.0/../../.. /../x86_64-w64-mingw32/bin/ld.exe:找不到-libopencv_core C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/8.2.0/../。 ./../../x86_64-w64-mingw32/bin/ld.exe:找不到-libopencv_highgui collect2.exe:错误:ld返回1退出状态终端进程以退出代码终止:1`
  • 你有任何闲散帐户,我可以向你发送正在发生的事情的截图
  • 我打开并检查了C:\msys64\mingw64\lib 所有文件都是这样的libopencv_core.dll.a 在 Windows 上是正常的,我说 Windows 因为我有 Windows,而不是 Linux 或 Mac。这就是为什么我在bountry 上说要求向我展示工作截图的原因,因为分配甚至没有窗口并显示 Linux 机器的答案。
  • @George 你拼错了-lopencv_core 等。复制并粘贴我的答案中的命令。是的,我有 Windows 10 x64。不,我对你的截图不感兴趣
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-01
    • 2018-06-04
    • 2011-06-20
    • 1970-01-01
    • 2015-06-02
    • 1970-01-01
    相关资源
    最近更新 更多