[VC++ 2008] error LNK2001: unresolved external symbol



  • Hallo,
    Ich bin verhältnissmäßig unerfahren mit C++ und MVC und bin auf diesen error gestoßen:

    1>main.obj : error LNK2019: unresolved external symbol "public: void __thiscall Filestream<class Movie>::write(class Movie)" (...) referenced in function _SDL_main
    1>D:\...\Visual Studio 2008\Projects\Movie Database\Debug\Movie Database.exe : fatal error LNK1120: 1 unresolved externals
    

    Google sagt mir, dass das an einem fehlenden .lib file liegt (meißt in Verbindung mit dlls o.Ä.).
    Das sollte aber bei mir nich der Fall sein, da ich keine DLLs benutze (bzw die DLLs funktionieren perfekt und haben mit der Funktion nichts zu tun). Deshalb bin ich grade ein wenig verloren.
    Der Fehler muss also irgendwo in den Files stecken. Da kann ich aber nichts finden.

    Das komplette Programm ist etwas größer, aber dies sind die wichtigen files:

    // _PCH.h //
    ////////////
    #ifndef _PCH_H //Main header file
    #define _PCH_H //für alles.
    
    #include <string>
    #include <sstream> //For IntToString
    #include <fstream> //For data reading/writing
    
    //Hier sind noch einige andere includes, die aber
    //keine Probleme machen.
    
    #include "Movie.h"
    #include "Filestream.h"
    
    #endif
    
    // Movie.h //
    /////////////
    //Die Movie-Klasse ist im Grunde nur ein kleiner Container
    //für Name bzw Alter.
    //Movie selbst funktioniert.
    #include "_PCH.h"
    
    using namespace std;
    
    class Movie
    {
    public:
        char name[160];
        short int age;  
    
        void setData(string p_name, int p_age);
    };
    
    // Movie.cpp //
    ///////////////
    #include "_PCH.h"
    
    using namespace std;
    
    void Movie::setData(string p_name, int p_age){  
          strncpy_s (name, 160, p_name.c_str(),160);
          age=p_age;
    }
    
    // Filestream.h //
    //////////////////
    //Filestream öffnet binary files um sie zu schreiben/
    //lesen. Es ist als template gemacht, um zu verhindern,
    // dass man verschiedene Klassen im selben Stream speichert.
    // (Außer man öffnet ausdrücklich das selbe file.)
    #include "_PCH.h"
    
    using namespace std;
    
    template <class T>
    class Filestream {
    	fstream file;
    	char* filepath;
    
      public:
    	Filestream();
    	Filestream(string s);
    	void write(T obj);
    	T read(int pos);
    	int getEntryCount();
    };
    
    // Filestream.cpp //
    ////////////////////
    #include "_PCH.h"
    
    using namespace std; 
    
    template <class T>
    void Filestream<T>::write(T obj){
    	file.open(filepath, ios::app | ios::out |  ios::in | ios::binary );                                
    	file.write( reinterpret_cast<char*>(&obj), sizeof(obj) );  
    	file.close();
    }
    
    template <class T>
    T Filestream<T>::read(int pos){
    	Movie temp;
    
    	file.open(filepath, ios::app | ios::out |  ios::in | ios::binary );
    	file.seekg(sizeof(temp)*pos);                                  
    	file.read( reinterpret_cast<char*>(&temp), sizeof(temp) );  
    	file.close();
    
    	return pers.name;
    }
    
    template <class T>
    int getEntryCount(){
    	long begin,end;
    
    	ifstream myfile (filepath);
    	begin = myfile.tellg();
    	myfile.seekg (0, ios::end);
    	end = myfile.tellg();
    	myfile.close();
    
    	return (end-begin)/sizeof(T);
    }
    
    template <class T>
    Filestream<T>::Filestream(){
    }
    
    template <class T>
    Filestream<T>::Filestream(string s){
    	filepath=s.c_str();
    }
    
    // main.cpp //
    ///////////////
    include "_PCH.h"
    
    using namespace std;
    
    int main( int argc, char* args[] )
    {
        Movie m;
    
        Filestream<Movie> b;
    
        b.write(m); //Diese Zeile verursacht Probleme.
                    //Andere Funktionen dieser Klasse machen
                    //auch Probleme
    
        return 0;
    }
    

    b.write(m) in main() verursacht diesen Fehler. Filestream<Movie> b compiled aber wunderbar.

    Das ist das erste Mal, dass ich mit templates und fstream arbeite (sowieso das erste Mal, dass ich mich an ein größeres C++ Projekt ranmache), deshalb wäre es nett, wenn Ihr bei spezifischeren Antworten ein bisschen ins Detail gehen könntet 🙂

    Vielen Dank im Voraus,

    ~s3rius



  • Kleiner Bump.

    Ich habe das Programm jetzt zum laufen gebracht, indem ich folgendes noch in Filestream.cpp geschrieben habe:

    void RAWR(){
    	Movie m;
    	Filestream<Movie> c("a");
    	c.read(3);
    	c.write(m);
    	c.getEntryCount();
    }
    

    Danach funktioniert plötzlich alles. Ich muss RAWR() noch nicht einmal aufrufen. Es scheint so, als ob das Programm die Filestream-methoden erst "kennen lernen" muss, damit ich sie dann in der main.cpp benutzen kann.
    Falls ich z.B. c.getEntryCount() aus RAWR() auskommentiere, verursacht der selbe Aufruf in main() den o.g. Linkerfehler. Das selbe gilt für die anderen.

    Im Grunde funktioniert das Programm also schon, nur aber mir diesem workaround, den ich schon gerne los haben würde.
    Falls also jemand weiß, was dieses Verhalten verursacht (oder ob es vllt. ein Bug in MVC++ ist) - ich bin für Tipps dankbar 🙂

    ~s3rius


Log in to reply