it-swarm.com.de

fehler LNK2019: nicht aufgelöstes externes Symbol opencv

Ich habe dieses einfache Programm geschrieben, das Matrizen aus TXT-Dateien lädt und Entfernungen berechnet. Wenn ich das Programm in Visual Studio unter Windows kompiliere, erhalte ich folgende Fehler:

1>main.obj : error LNK2019: unresolved external symbol "void __cdecl cv::fastFree(void *)" ([email protected]@@[email protected]) referenced in function "public: __thiscall     cv::Mat::~Mat(void)" ([email protected]@@[email protected])
1>system.obj : error LNK2001: unresolved external symbol "void __cdecl cv::fastFree(void *)" ([email protected]@@[email protected])
1>main.obj : error LNK2019: unresolved external symbol "public: void __thiscall cv::Mat::deallocate(void)" ([email protected]@[email protected]@QAEXXZ) referenced in function "public: void __thiscall cv::Mat::release(void)" ([email protected]@[email protected]@QAEXXZ)
1>system.obj : error LNK2001: unresolved external symbol "public: void __thiscall cv::Mat::deallocate(void)" ([email protected]@[email protected]@QAEXXZ)
1>main.obj : error LNK2019: unresolved external symbol "int __cdecl cv::_interlockedExchangeAdd(int *,int)" ([email protected]@@[email protected]) referenced in function "public: void __thiscall cv::Mat::release(void)" ([email protected]@[email protected]@QAEXXZ)
1>system.obj : error LNK2001: unresolved external symbol "int __cdecl cv::_interlockedExchangeAdd(int *,int)" ([email protected]@@[email protected])
1>system.obj : error LNK2019: unresolved external symbol "public: __thiscall cv::Exception::Exception(int,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,int)" ([email protected]@@[email protected][email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]) referenced in function "public: int & __thiscall cv::Mat::at<int>(int,int)" ([email protected]@[email protected]@@[email protected])
1>system.obj : error LNK2019: unresolved external symbol "public: virtual __thiscall cv::Exception::~Exception(void)" ([email protected]@@[email protected]) referenced in function "public: int & __thiscall cv::Mat::at<int>(int,int)" ([email protected]@[email protected]@@[email protected])
1>system.obj : error LNK2019: unresolved external symbol "void __cdecl cv::error(class cv::Exception const &)" ([email protected]@@[email protected]@@Z) referenced in function "public: int & __thiscall cv::Mat::at<int>(int,int)" ([email protected]@[email protected]@@[email protected])
1>system.obj : error LNK2019: unresolved external symbol "public: void __thiscall cv::Mat::create(int,int const *,int)" ([email protected]@[email protected]@[email protected]) referenced in function "public: void __thiscall cv::Mat::create(int,int,int)" ([email protected]@[email protected]@[email protected])
1>C:\Users\Ram\documents\visual studio 2012\Projects\descrip\Debug\descrip.exe : fatal error LNK1120: 7 unresolved externals

Ich habe opencv 2.4.6 auf meinem Computer installiert und es richtig mit Visual Studio verbunden.

main.cpp

#include "system.h"

using namespace std;

int main(int argc, char* argv[]){    
  if(argc != 3){
    cout << "Not enough arguments" << endl;
    exit(-1);
  }

  System s(argv[2]);
  s.Parse_Centers(argv[1]);
  s.Run();
  return 0;
} 

system.h

#include <iostream>
#include <fstream>
#include <dirent.h> 
#include <time.h>
#include "cv.h"
#include "highgui.h"
#include "opencv2/opencv.hpp"

#define NUM_CENTERS 5000
#define NUM_COL 512

using namespace cv;

class System{
public:
    System(char *dir);
    void Run();
    void Parse_Centers(char* path);
    void Compute_Histogram(const char* filename);

private:
    Mat centers;
    Mat centers_zero;
    char *dir_path;
};

system.cpp

#include "system.h"

using namespace std;
using namespace cv;

System::System(char *dir){
    centers.create(NUM_CENTERS, NUM_COL, CV_8U);
    centers_zero.create(NUM_CENTERS, NUM_COL, CV_8U);
    dir_path = dir;
};

void System::Parse_Centers(char* path){
    ifstream fin;
    int temp, n, line = 0;
    fin.open(path);

    if(!fin.good()){ 
        throw 1; 
    }

    while(!fin.eof()){
        char buf[2048];
        const char* token[NUM_COL] = {};

        n = 0;
        fin.getline(buf, 2048);
        token[0] = strtok(buf, ",");

        if(token[0]){
            temp = atoi(token[0]);
            if(temp){
                centers.at<int>(line,n) = temp;
                centers_zero.at<int>(line,n) = temp * temp;
            }

            for(int n = 1; n < 512; n++){
                token[n] = strtok(0, ",");
                temp = atoi(token[n]);
                if(temp){
                    centers.at<int>(line,n) = temp;
                    centers_zero.at<int>(line,n) = temp * temp;
                }
            }
        }
        line++;
    }

    fin.close();
};  

void System::Run(){
    DIR *dir;
    struct dirent *entry;
    time_t start_t;
    time_t end_t;

    dir = opendir(dir_path);
    if(!dir){
        cout << "Directory wasn't found" << endl;
        throw 3;  
    }

    while((entry = readdir(dir)) != NULL){
        if(entry->d_name[0] != '.'){
            string path = string(dir_path) + "/" + string(entry->d_name);
            cout << "entry: " << path;
            time(&start_t);
            Compute_Histogram(path.c_str());
            time(&end_t);
            cout << "   " << difftime(start_t,end_t) << "sec" << endl;
        }
    }

    closedir(dir);
}

void System::Compute_Histogram(const char* filename){
    int dist[NUM_CENTERS];
    int desc[NUM_CENTERS] = {0};
    int temp, place = 0;

    ifstream fin;
    fin.open(filename);

    if(!fin.good()){ 
        throw 2; 
    }

    while(!fin.eof()){
        char buf[2048];
        const char* token[512] = {};

        fin.getline(buf, 2048);
        token[0] = strtok(buf, ",");
        if(token[0]){
            temp = atoi(token[0]);
            if(temp){
                for(int i = 0; i < NUM_CENTERS; i++){
                    dist[i] = (temp - centers.at<int>(i,0)) * (temp - centers.at<int>(i,0));
                }
            }
            else{
                for(int i = 0; i < NUM_CENTERS; i++){  
                    dist[i] = centers_zero.at<int>(i,0);
                }
            }

            for(int n = 1; n < NUM_COL; n++){
                token[n] = strtok(0, ",");
                temp = atoi(token[n]);

                if(temp){
                    for(int i = 0; i < NUM_CENTERS; i++){
                        dist[i] += (temp - centers.at<int>(i,n)) * (temp - centers.at<int>(i,n));
                        if((n == 511) && (i > 0)){
                            if(dist[i] < dist[place]){
                                place = i;
                            }
                        }
                    }
                }
                else{
                    for(int i = 0; i < NUM_CENTERS; i++){
                        dist[i] += centers_zero.at<int>(i,n);
                        if((n == 511) && (i > 0)){
                            if(dist[i] < dist[place]){
                                place = i;
                            }
                        }
                    }
                }
            }
        }

        desc[place]++;
    }

    fin.close();

    ofstream outfile;
    string path;
    path = string(filename) + ".csv";
    outfile.open(path.c_str());
    for(int i = 0; i < 4999; i++){
        outfile << desc[i] << ",";
    }
    outfile << desc[4999];
    outfile.close();
};

Was mache ich falsch????

22
RamBracha

Wie andere bereits erwähnt, müssen Sie sicherstellen, dass Sie eine korrekte Verknüpfung zu den OpenCV-Bibliotheken herstellen. 

Stellen Sie sicher, dass Ihr Projekt -> Eigenschaften -> VC++ - Verzeichnisse -> Bibliotheksverzeichnisse den Pfad enthält, in dem sich die OpenCV-Bibliotheken befinden. Der Standardwert lautet "C:\opencv\build\x86\vc11\lib" 32-Bit-Maschine, auf der VS2012 ausgeführt wird, hängt von anderen Setups ab).

Überprüfen Sie als Nächstes, ob die folgenden Bibliotheken in Ihrem Projekt -> Eigenschaften -> Linker -> Eingabe -> Zusätzliche Abhängigkeiten enthalten sind:

opencv_core246d.lib
opencv_imgproc246d.lib
opencv_highgui246d.lib
opencv_ml246d.lib
opencv_video246d.lib
opencv_features2d246d.lib
opencv_calib3d246d.lib
opencv_objdetect246d.lib
opencv_contrib246d.lib
opencv_legacy246d.lib
opencv_flann246d.lib

Wenn die obigen Angaben richtig sind, sollten Sie keine weiteren OpenCV-Link-Fehler mehr erhalten.

23
RedFred

Vielleicht bauen Sie für win32, aber verknüpfen sich mit x64. Wenn Sie Ihre Anwendung auf x64 setzen, wird sie erstellt, während in win32 Verknüpfungsfehler auftreten. Klicken Sie mit der rechten Maustaste auf die Lösung und gehen Sie zur Spalte Konfiguration der Plattform. Ich fand es schwierig, dies einzustellen, ich frage mich, ob es fehlerhaft ist oder nicht.

13
Elliot

Sie haben wahrscheinlich die richtigen Header-Dateien hinzugefügt, haben aber vergessen, die Bibliothek hinzuzufügen. Sie müssen die entsprechende * .lib-Datei in den Projekteinstellungen hinzufügen.

1
hunger

Befolgen Sie die Schritte, um das Problem zu lösen

  • Klicken Sie mit der rechten Maustaste auf Projekt und wählen Sie Einstellungen-> C++ -> Allgemein-> Zusätzliche Include-Verzeichnisse. Klicken Sie auf Bearbeiten und fügen Sie dieses C:\opencv\build\include hinzu.

  • Gehen Sie nun zu settings-> Linker-> General-> Additional library Directories und fügen Sie C:\opencv\build\x64\vc15\lib ein

  • Gehen Sie nun zu settings-> Linker-> Input und fügen Sie opencv_world343.lib, opencv_world343d.lib ein, das ist alles. Diese Einstellungen gelten jedoch nur für Visual Studio 2017 und OpenCV 3.4.3.

0
Shaikh Chili

Alle Antworten zeigen in die richtige Richtung, aber ich möchte aktualisieren, was RedFred auf den neuesten Stand von heute (4.0.0) geantwortet hat. Ändern Sie die Bibliotheken, für die er erwähnt hat:

opencv_core400d.lib
opencv_imgproc400d.lib
opencv_highgui400d.lib
opencv_ml400d.lib
opencv_video400d.lib
opencv_features2d400d.lib
opencv_calib3d400d.lib
opencv_objdetect400d.lib
opencv_flann400d.lib 

Für die nächsten oder vorherigen Builds gehen Sie einfach zu Ihrem lib-Ordner in Ihrem opencv-Verzeichnis und suchen Sie nach jedem der Elemente in der Liste, die RedFred oder ich bereitgestellt habe (offensichtlich kopieren und einfügen Sie nur bis zum letzten Buchstaben vor der Versionsnummer, in meinem Fall 400) und erstellen Sie Ihre eigene zusätzliche Abhängigkeitsliste für Ihren Linker.

Übrigens musste ich meine Visual Studio .sln-Datei mit CMake aus dem Quellcode erstellen und mit VS erstellen. Dann kam aus irgendeinem Grund mit der Quelldatei keine Include-Datei. Ich fügte sie dann zu meinen Include-Verzeichnissen aus dem Win-Pack .

0