none
Compilatore: Link esterno non risolto RRS feed

  • Domanda

  • Ciao a tutti,

    sono un novizio del Visual C++ e pertanto vorrete perdonare la domanda alquanto banale che vi pongo.

    Ho seguito la guida qui posta sul sito msdn per creare un fil d'intestazione (.h) da riutilizzare dove-come-quando si vuole all'interno di futuri programmi.

    /*
    *  Libreria che legge un file xml creato dal programma di calibrazione
    *  delle openCV e restituisce i fattori per l'aggiustamento del'immagine
    *  a fronte dell'errore di distorsione
    */
    #pragma once
    #ifndef XML_READER_H
    #define XML_READER_H
    
    #include <opencv2\core\core.hpp>
    #include <opencv2\calib3d\calib3d.hpp>
    #include <stdio.h>
    #include <iostream>
    
    	using namespace std;
    	using cv::FileNodeIterator;
    	using cv::FileNode;
    	using cv::FileStorage;
    	using cv::Mat;
    	using cv::Size;
    
    	const string vers="1.0.0";
    
    	class Lettore
    	{
    	public:
    		Lettore() {goodInput = false;} // construttore
    
    		// Metodo di lettura. In ingresso il percorso del file da leggere.
    		int leggiFile(string path);
    
    		// Interprete dei nodi del file
    		void interprate();
    
    		// Metodi di lettura e scrittura
    		Mat* getCameraMatrix() { return &cameraMatrix; }
    		Mat* getDistortionCoefficients() { return &distortionCoefficients; }
    		string getCalibrationTime() { return calibrationTime; }
    
    	private:
    		void setCameraMatrix(Mat mtrx);
    		void setDistortionCoefficients(Mat coeff);
    		void setCalibrationTime(string time);
    	private:
    		Mat cameraMatrix;
    		Mat distortionCoefficients;
    		string calibrationTime;
    		bool goodInput;
    	};
    
    #endif

    Qui sopra vi ho postato il codice del file .h. Di Seguito ho creato un file .cpp che implementasse i vari metodi, come potete vedere di seguito:

    #include "xmlReader.h"
    
    using namespace cv;
    using namespace std;
    
    void Lettore::setCameraMatrix(Mat mtrx) {
    	cameraMatrix = mtrx; 
    }
    
    void Lettore::setDistortionCoefficients(Mat coeff) { 
    	distortionCoefficients = coeff; 
    }
    
    void Lettore::setCalibrationTime(string time) { 
    	calibrationTime = time; 
    }
    
    int Lettore::leggiFile(string path) {      //read serialization for this class
    	string time;
    	Mat matrix, coeff;
    
    	cout<<"Versione xmlReader:"<<vers<<endl;
    
    	FileStorage fs(path, FileStorage::READ); // Read the settings
    	if (!fs.isOpened()) {
            return -1;
        }
    	string tmp;
    	fs["calibration_Time"] >> time; 
    	fs["Camera_Matrix"] >> matrix;
    	fs["Distortion_Coefficients"] >> coeff;
    
    	setCalibrationTime(time);
    	setCameraMatrix(matrix);
    	setDistortionCoefficients(coeff);
    
    	interprate();
    	return (goodInput ? 1 : -1);
    		
    }
    
    void Lettore::interprate() {
    	goodInput = true;
    	if(calibrationTime.empty()) {
    		cout << "Invalid calibration time: " << calibrationTime << endl;
    		goodInput = false;
    	}
    
    	if(cameraMatrix.empty()) {
    		cout << "Invalid camera matrix input: " << endl;
    		goodInput = false;
    	}
    
    	if(distortionCoefficients.empty()) {
    		cout << "Invalid distortion coeffiencients: " << endl;
    		goodInput = false;
    	}
    }


    Ho compilato il tutto e non ho avuto alcun problema. E' stato creato il file .lib corrispondente, e fin qui tutto bene.

    Ho creato un nuovo progetto e ho provato a richiamare la mia libreria di cui sopra:

    #include <iostream>
    #include <sstream>
    #include <time.h>
    #include <stdio.h>
    
    #include "C:\Librerie\include\xmlReader.h"
    
    
    using namespace cv;
    using namespace std;
    
    
    int main(int argc, char* argv[]) {
    	Lettore l;
    	const string inputFile = argc > 1 ? argv[1] : "default.xml";
    
    
    	l.leggiFile(inputFile);
    }

    Ma ecco che qui il solerte compilatore mi dice che:

    coordinateMondo.obj : error LNK2001: simbolo esterno "public: int __cdecl Lettore::leggiFile(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (?leggiFile@Lettore@@QEAAHV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) non risolto
    1>C:\Users\Lombardi\Documents\Visual Studio 2010\Projects\ConversionePuntiDopoCalibrazione\x64\Release\ConversionePuntiDopoCalibrazione.exe : fatal error LNK1120: 1 esterni non risolti

    Ossia non riesce a risolvere il link esterno "leggiFile",ma non capisco il perchè. Durante la scrittura del codice non avevo alcun problema, e dopo la dichiarazione Lettore l, vedevo che l'oggetto l era riconosciuto e l'editor mi dava i suggerimenti per accedere agli oggetti.

    Dove sbaglio? Qualche idea?

    Grazie mille a tutti


    giovedì 15 maggio 2014 15:34

Tutte le risposte