web-dev-qa-db-fra.com

Erreur irrécupérable lors de la compilation de C++ MinGW Opencv

Bonjour à tous, Je souhaite utiliser VSCode MinGW C++ et OpenCV pour créer un projet OpenCV simple, mais pour une raison inconnue, je reçois cette erreur. Que dois-je faire?

Je tiens à mentionner que dans Visual studio 2017 fonctionne, je peux exécuter le fichier main.cpp sur une architecture x64.

Le code ci-dessous est ce que je veux exécuter sur VSCode est le même que celui que je lance sur Visual Studio 2017.

Après 10 jours d’essai, j’abandonne le 50 points si quelqu'un le prouve avec:

  • VSCODE
  • C++ 17
  • Ouverture 
  • sur l'architecture Windows 10 x64

Une construction réussie.

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;
}

Dans mon éditeur VSCode, j'essaie de construire l'application à l'aide du fichier tasks.json avec 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
}

Et je reçois cette erreur

> 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.

J'ai généré les bibliothèques opencv en utilisant la variable vcpkg à l'aide de la commande vcpkg install opencv et je pense que le travail est très bien fait.

Après avoir généré tous les fichiers avec la vspkg, je teste tous les fichiers avec Visual Studio 2017 et tout fonctionne, mais mon objectif principal est de faire en sorte que la VSCode fonctionne, mais je ne sais pas pourquoi je reçois les erreurs.

Pour vous montrer que j'ai généré les fichiers.

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

6
George C.

Voici les instructions pour configurer OpenCV dans MSYS2/mingw64. Je ne peux pas vous aider avec VsCode mais peut-être que cela vous aidera à progresser ou à aider les autres personnes qui trouvent cette question en cherchant.


Vous n'avez pas besoin de créer OpenCV vous-même; il existe des fichiers binaires pré-emballés pour MinGW-w64. Le but de MSYS2 est de fournir un shell de style unix et d'agir en tant que gestionnaire de paquets. Si vous n'avez pas utilisé MSYS2 auparavant:

  1. Installez MSYS2 et mettez à jour au plus tard comme indiqué ici .
  2. Ouvrez un shell MSYS2/mingw64 (pas un shell MSYS2/msys2). Les fichiers binaires construits dans ce shell s'exécutent en tant que fichiers binaires Windows autonomes. Ils ne dépendent pas de l'environnement MSYS2.
  3. Testez que g++ fonctionne.

Ensuite, vous pouvez ajouter OpenCV:

  • pacman -Ss mingw64/mingw-w64-x86_64-opencv

et tout est prêt à partir. J'ai compilé votre exemple de programme à l'aide de la commande suivante dans MSYS2 Shell:

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

et exécuté le programme avec succès.


Notez qu'il n'est pas nécessaire d'utiliser MSYS2 pour l'environnement de construction. vous pouvez appeler g++ à partir d'une invite de commande Windows ou de tout autre IDE si vous configurez les chemins d'accès Include et Library de manière à pointer vers l'emplacement où le gestionnaire de packages de MSYS2 a installé les en-têtes et les bibliothèques. (Qui est sous /mingw64/include/opencv* et /mingw64/lib, sous la racine d'installation de MSYS2).

3
M.M

Installez vcpkg (le conditionneur MS pour installer des projets open source basés sur Windows) et utilisez la commande powershell .\vcpkg install opencv:x64-windows-static. Les bibliothèques de dépendances seront automatiquement installées pour vous.

Opencv peut être intégré automatiquement dans votre projet VS à l'aide de .\vcpkg integrate install.

1
seccpur