error LNK2019: Verweis auf nicht aufgelöstes externes Symbol



  • Hallo,

    ich habe ein Problem Beim Komplieren meines Programmes mit MS Visual Studio 2010.

    Wenn ich den Vorgang start bekomme ich folgende Fehlermeldungen:

    cl /EHsc main.cpp
    Microsoft (R) 32-Bit C/C++-Optimierungscompiler Version 16.00.30319.01 für 80x86
    
    Copyright (C) Microsoft Corporation. Alle Rechte vorbehalten.
    
    main.cpp
    Microsoft (R) Incremental Linker Version 10.00.30319.01
    Copyright (C) Microsoft Corporation.  All rights reserved.
    
    /out:main.exe
    main.obj
    main.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public
    : __thiscall mathTime::~mathTime(void)" (??1mathTime@@QAE@XZ)" in Funktion "_mai
    n".
    main.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public
    : class ownTime __thiscall mathTime::addTime(class ownTime,class ownTime)" (?add
    Time@mathTime@@QAE?AVownTime@@V2@0@Z)" in Funktion "_main".
    main.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public
    : __thiscall ownTime::~ownTime(void)" (??1ownTime@@QAE@XZ)" in Funktion "_main".
    
    main.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public
    : class ownTime __thiscall mathTime::subTime(class ownTime,class ownTime)" (?sub
    Time@mathTime@@QAE?AVownTime@@V2@0@Z)" in Funktion "_main".
    main.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public
    : void __thiscall ownTime::ausgabe(void)" (?ausgabe@ownTime@@QAEXXZ)" in Funktio
    n "_main".
    main.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public
    : int __thiscall ownTime::getMinute(void)" (?getMinute@ownTime@@QAEHXZ)" in Funk
    tion "_main".
    main.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public
    : int __thiscall ownTime::getHour(void)" (?getHour@ownTime@@QAEHXZ)" in Funktion
     "_main".
    main.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public
    : void __thiscall ownTime::manSetzen(void)" (?manSetzen@ownTime@@QAEXXZ)" in Fun
    ktion "_main".
    main.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public
    : void __thiscall ownTime::setMinute(int)" (?setMinute@ownTime@@QAEXH@Z)" in Fun
    ktion "_main".
    main.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public
    : void __thiscall ownTime::setHour(int)" (?setHour@ownTime@@QAEXH@Z)" in Funktio
    n "_main".
    main.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public
    : __thiscall mathTime::mathTime(void)" (??0mathTime@@QAE@XZ)" in Funktion "_main
    ".
    main.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public
    : __thiscall ownTime::ownTime(void)" (??0ownTime@@QAE@XZ)" in Funktion "_main".
    main.exe : fatal error LNK1120: 12 nicht aufgelöste externe Verweise.
    

    Mein Programm besteht nur aus selbst geschriebenen Klassen und den Standardbibliotheken.

    Ich habe im Forum schon nach dem Problem gesucht, jedoch nicht mein persönliches Problem gefunden.

    Ich bedanke mich schon einmal im Voraus!

    Hier der Quellcode der Klassen dessen Methoden die Fehler verursachen:

    Klasse ownTime (Definition)

    #ifndef OWNTIME_H
    #define OWNTIME_H
    #pragma once
    #include "D:\Download\VSC++2010E\Projekte\Zeiterfassung\Zeiterfassung\errorhandler.h"
    
    class ownTime : public errorhandler
    {
    private:
    	int minute;
    	int hour;
    	int day;
    	int month;
    	int year;
    
    public:
    
    	int getMinute(void);
    	int getHour(void);
    	int getDay(void);
    	int getMonth(void);
    	int getYear(void);
    
    	void setMinute(int a);
    	void setHour(int a);
    	void setDay(int a);
    	void setMonth(int a);
    	void setYear(int a);
    
    	void ausgabe(void);
    	void manSetzen(void);
    
    	ownTime(void);
    	~ownTime(void);
    };
    
    #endif
    

    Klasse ownTime (Definition)

    #include "D:\Download\VSC++2010E\Projekte\Zeiterfassung\Zeiterfassung\ownTime.h"
    
    ownTime::ownTime(void){
    	minute=0;
    	hour=0;
    	day=1;
    	month=1;
    	year=0;
    }
    
    ownTime::~ownTime(void)
    {
    }
    
    int ownTime::getMinute(void){
    	return ownTime::minute;
    }
    
    int ownTime::getHour(void){
    	return ownTime::hour;
    }
    
    int ownTime::getDay(void){
    	return ownTime::day;
    }
    
    int ownTime::getMonth(void){
    	return ownTime::month;
    }
    
    int ownTime::getYear(void){
    	return ownTime::year;
    }
    
    void ownTime::setMinute(int a){
    	if(a>=0 && a<=59){
    		ownTime::minute = a;
    
    		ownTime::setErr(0);
    	}
    	else{
    		ownTime::setErr(1);
    		ownTime::errOutput();
    	}
    }
    
    void ownTime::setHour(int a){
    	if(a>=0 && a<=23){
    		ownTime::hour = a;
    
    		ownTime::setErr(0);
    	}
    	else{
    		ownTime::setErr(1);
    		ownTime::errOutput();
    	}
    }
    
    void ownTime::setDay(int a){
    	if(a>=1 && a<=31){
    		ownTime::day = a;
    
    		ownTime::setErr(0);
    	}
    	else{
    		ownTime::setErr(1);
    		ownTime::errOutput();
    	}
    }
    
    void ownTime::setMonth(int a){
    	if(a>=1 && a<=12){
    		ownTime::month = a;
    
    		ownTime::setErr(0);
    	}
    	else{
    		ownTime::setErr(1);
    		ownTime::errOutput();
    	}
    }
    
    void ownTime::setYear(int a){
    	ownTime::year = a;
    }
    
    void ownTime::ausgabe(void){
    	if(ownTime::getMinute()>=10)
    		std::cout << ownTime::getHour() << ":" << ownTime::getMinute() << std::endl;
    	else
    		std::cout << ownTime::getHour() << ":0" << ownTime::getMinute() << std::endl;
    }
    
    void ownTime::manSetzen(void){
    	int value;
    
    	do{																			//Manuelles setzen der Klasse (Stunden)
    		std::cout << "Stunden" << std::endl;
    		std::cin >>  value;
    		getchar();																//Abfangen des cin auf zukünftige Pausen
    		std::cout << std::endl;
    
    		ownTime::setHour(value);
    
    		system("cls");
    	}while(ownTime::getErr()!=0);
    
    	do{																			//Manuelles setzen der Klasse (Minuten)
    		std::cout << "Minuten" << std::endl;
    		std::cin >>  value;
    		getchar();																//Abfangen des cin auf zukünftige Pausen
    		std::cout << std::endl;
    
    		ownTime::setMinute(value);
    
    		system("cls");
    	}while(ownTime::getErr()!=0);												//Wiederholen bis Fehlerfrei
    }
    

    Klasse mathTime (Definition)

    #ifndef MATHTIME_H
    #define MATHTIME_H
    #pragma once
    #include "D:\Download\VSC++2010E\Projekte\Zeiterfassung\Zeiterfassung\owntime.h"
    
    class mathTime : public ownTime
    {
    public:
    	ownTime addTime(ownTime a, ownTime b);
    	ownTime subTime(ownTime a, ownTime b);
    
    	mathTime(void);
    	~mathTime(void);
    };
    
    #endif
    

    Klasse mathTime (Deklaration)

    #include "D:\Download\VSC++2010E\Projekte\Zeiterfassung\Zeiterfassung\mathTime.h"
    
    mathTime::mathTime(void){
    }
    
    mathTime::~mathTime(void){
    }
    
    ownTime mathTime::addTime(ownTime a, ownTime b){
    	ownTime result;
    
    	if(a.getMinute()+b.getMinute()<=59)
    		result.setMinute(a.getMinute()+b.getMinute());
    	else{
    		result.setMinute(a.getMinute()+b.getMinute()-60);
    		b.setHour(b.getHour()+1);
    	}
    
    	if(a.getHour()+b.getHour()<=23)
    		result.setHour(a.getHour()+b.getHour());
    	else{
    		result.setHour(a.getHour()+b.getHour()-24);
    	}
    	return result;
    }
    ownTime mathTime::subTime(ownTime a, ownTime b){
    	ownTime result;
    
    	if(a.getMinute()-b.getMinute()>=0)
    		result.setMinute(a.getMinute()-b.getMinute());
    	else{
    		result.setMinute(a.getMinute()-b.getMinute()+60);
    		a.setHour(a.getHour()-1);
    	}
    
    	if(a.getHour()-b.getHour()>=0)
    		result.setHour(a.getHour()-b.getHour());
    	else{
    		result.setHour(a.getHour()-b.getHour()+24);
    	}
    
    	return result;
    }
    

    Main

    #include <iostream>
    #include <time.h>
    
    #include "D:\Download\VSC++2010E\Projekte\Zeiterfassung\Zeiterfassung\ownTime.h"
    #include "D:\Download\VSC++2010E\Projekte\Zeiterfassung\Zeiterfassung\mathTime.h"
    #include "D:\Download\VSC++2010E\Projekte\Zeiterfassung\Zeiterfassung\errorhandler.h"
    
    using namespace std;
    
    int main(void){
    	ownTime startZeit;																							// Deklarieren der Rahmenzeiten
    	ownTime endZeit;
    	ownTime startPause;
    	ownTime endPause;
    
    	ownTime stunden;																							// Deklarieren der berechneten Zeiten
    	ownTime pause;
    
    	ownTime fixArbeitszeit;																						// Deklarieren der festen Zeiten
    	ownTime fixPause;
    
    	mathTime op;																								// Deklarieren des Rechen-Operators
    
    	int choice = 0;																								// Deklarieren der Hilfsvariablen
    	int off = 0;
    	int value = 0;
    
    	time_t rawtime;																								// Deklarieren der Variablen fürs automatische Setzen
    	struct tm * currTime;
    
    	system("color f0");																							//CMD Lesbar gestallten.
    
    	do{																											//Programm-Schleife
    
    	fixArbeitszeit.setHour(7);																					// Definieren der festen Zeiten
    	fixArbeitszeit.setMinute(48);
    	fixPause.setMinute(30);
    
    		cout << "Men\x81" << endl;																				//Hauptmenü
    		cout << "----" << endl;
    		cout << "1 = Eingabe von Zeiten" << endl;
    		cout << "2 = Ausgabe von Zeiten" << endl;
    		cout << "3 = Berechnung der Zeiten" << endl;
    		cout << "4 = Beenden" << endl;
    
    		cin >> choice;
    		getchar();																								//Abfangen des cin auf zukünftige Pausen
    
    		if(choice==4)																							//Setzen der Hilfvariable fürs Beenden des Programms
    			off = 1;
    
    		system("cls");
    
    		switch(choice){ 
    			case 1: do{																							//Untermenü-Schleife Eingabe der Zeiten
    
    						cout << "Eingabe von Zeiten" << endl; 
    						cout << "------------------" << endl;
    						cout << "1 = Arbeitszeitanfang" << endl;
    						cout << "2 = Arbeitszeitende" << endl;
    						cout << "3 = Pausenanfang" << endl;
    						cout << "4 = Pausenende" << endl;
    						cout << "5 = Zur\x81" << "ck" << endl;
    
    						cin >> choice;																			//Abfrage des Menüpunktes
    						getchar();																				//Abfangen des cin auf zukünftige Pausen
    
    						system("cls");
    
    						switch(choice){ 
    							case 1:	startZeit.manSetzen();														//Manuelles setzen der startZeit
    
    									break;
    
    							case 2: endZeit.manSetzen();														//Manuelles setzen der endZeit
    
    									break;
    
    							case 3: startPause.manSetzen();														//Manuelles setzen der startPause
    
    									break;
    
    							case 4: endPause.manSetzen();														//Manuelles setzen der endPause
    
    									break;
    
    							case 5: if((startZeit.getHour() > endZeit.getHour()) && !(endZeit.getHour()==0 && endZeit.getMinute()==0)){				// Abfangen von ungültigen eingaben
    										cout << "Arbeitszeitende darf nicht vor Arbeitszeitanfang liegen!" << endl;
    										getchar();
    
    										choice = 0;
    									}
    									else if((startZeit.getHour() == endZeit.getHour() && startZeit.getMinute() > endZeit.getMinute()) && !(endZeit.getHour()==0 && endZeit.getMinute()==0)){
    										cout << "Arbeitszeitende darf nicht vor Arbeitszeitanfang liegen!" << endl;
    										getchar();
    
    										choice = 0;
    									}
    
    									if((startPause.getHour()!=0 || startPause.getMinute()!=0)						// Abfangen von ungültigen eingaben
    									&& (endPause.getHour()!=0 || endPause.getHour()!=0)){
    										if(startZeit.getHour() > startPause.getHour()								// Abfangen von ungültigen eingaben
    										|| startZeit.getHour() > endPause.getHour()){
    											cout << "Pausenzeiten d\x81"<< "rfen nicht vor Arbeitszeitanfang liegen!" << endl;
    											getchar();
    
    											choice = 0;
    										}
    										else if(startZeit.getHour() == startPause.getHour() && startZeit.getMinute() > startPause.getMinute()
    											 || startZeit.getHour() == endPause.getHour() && startZeit.getMinute() > endPause.getMinute()) {
    											cout << "Pausenzeiten d\x81"<< "rfen nicht vor Arbeitszeitanfang liegen!" << endl;
    											getchar();
    
    											choice = 0;
    										}
    
    										if((endZeit.getHour() < startPause.getHour()									// Abfangen von ungültigen eingaben
    											|| endZeit.getHour() < endPause.getHour()) && !(endZeit.getHour()==0 && endZeit.getMinute()==0)){
    											cout << "Pausenzeiten d\x81"<< "rfen nicht nach Arbeitszeitende liegen!" << endl;
    											getchar();
    
    											choice = 0;
    										}
    										else if((endZeit.getHour() == startPause.getHour() && endZeit.getMinute() < startPause.getMinute()
    											 || endZeit.getHour() == endPause.getHour() && endZeit.getMinute() < endPause.getMinute()) && !(endZeit.getHour()==0 && endZeit.getMinute()==0)) {
    											cout << "Pausenzeiten d\x81"<< "rfen nicht nach Arbeitszeitende liegen!" << endl;
    											getchar();
    
    											choice = 0;
    										}
    									}
    									else if((startPause.getHour()==0 && startPause.getMinute()==0 || endPause.getHour()==0 && endPause.getHour()==0) 
    									     && !(startPause.getHour()==0 && startPause.getMinute()==0 && endPause.getHour()==0 && endPause.getHour()==0)){
    										cout << "Es m\x81"<< "ssen zwei Pausenzeiten eingegeben werden!" << endl;
    
    										getchar();
    
    										choice = 0;
    									}
    									else if(startPause.getHour()==0 && startPause.getMinute()==0 
    										 && endPause.getHour()==0 && endPause.getHour()==0){
    									}
    
    									system("cls");
    
    									break;
    
    							default: cout << "Es wurde eine falsche Zahl eingegeben." << endl;
    
    									 getchar();
    									 system("cls");
    						}
    					}while(choice!=5); 
    
    					break;
    
    			case 2: do{																							//Untermenü-Schleife Anzeige der Zeiten
    
    						cout << "Ausgabe von Zeiten" << endl;			
    						cout << "------------------" << endl;
    						cout << "1 = Arbeitszeitanfang" << endl;
    						cout << "2 = Arbeitszeitende" << endl;
    						cout << "3 = Pausenanfang" << endl;
    						cout << "4 = Pausenende" << endl;
    						cout << "5 = Zur\x81"<< "ck" << endl;
    
    						cin >> choice;
    						getchar();																				//Abfangen des cin auf zukünftige Pausen
    
    						system("cls");
    
    						switch(choice){
    
    							case 1: startZeit.ausgabe();														// Ausgabe der startZeit
    
    									getchar();
    									system("cls");
    									break;
    
    							case 2: endZeit.ausgabe();															// Ausgabe der endZeit
    
    									getchar();
    									system("cls");
    									break;
    
    							case 3: startPause.ausgabe();														// Ausgabe der startPause
    
    									getchar();
    									system("cls");
    									break;
    
    							case 4: endPause.ausgabe();															// Ausgabe der endPause
    
    									getchar();
    									system("cls");
    									break;
    
    							case 5: break;
    
    							default: cout << "Es wurde eine falsche Zahl eingegeben." << endl;
    
    									 getchar();
    									 system("cls");
    						} 
    					}while(choice!=5); 
    
    					break;
    
    			case 3: do{																							//Untermenü-Schleife Berrechnung der Zeiten
    
    						cout << "Berechnung der Zeiten" << endl;													
    						cout << "---------------------" << endl;
    						cout << "1 = Keine \x9A" << "berstunden" << endl;
    						cout << "2 = Bestimmte Uhrzeit" << endl;
    						cout << "3 = Aktuelle Arbeitszeit" << endl;
    						cout << "4 = Zur\x81" << "ck" << endl;
    
    						cin >> choice;
    						getchar(); //Abfangen des cin auf zukünftige Pausen
    
    						system("cls");
    
    						switch(choice){
    						case 1:		pause = op.subTime(endPause, startPause);									//startzeit + fixarbeitszeit + Pause (pause wenn größer fixPause)
    
    									stunden = op.addTime(startZeit, fixArbeitszeit);
    
    									if(pause.getHour()>fixPause.getHour())										//Rechnung der voraussichlichen endZeit
    										stunden = op.addTime(stunden, pause);
    									else if(pause.getMinute()>fixPause.getMinute())
    										stunden = op.addTime(stunden, pause);
    									else
    										stunden = op.addTime(stunden, fixPause);
    
    									stunden.ausgabe();															//Ausgabe Ergebnis
    
    									getchar();																	//Warten und Verlassen des Menüpunktes
    									system("cls");
    									break;
    
    							case 2:	pause = op.subTime(endPause, startPause);									//Endzeit - startzeit - Pause (pause wenn größer fixPause)
    
    									stunden = op.subTime(endZeit, startZeit);									//Rechnung der Gesamtstunden
    
    									if(stunden.getHour()>=2){
    										if(pause.getHour()>fixPause.getHour())									
    											stunden = op.subTime(stunden, pause);
    										else if(pause.getMinute()>fixPause.getMinute())
    											stunden = op.subTime(stunden, pause);
    										else{
    											if(stunden.getHour()>=6)
    												stunden = op.subTime(stunden, fixPause);
    											else if(stunden.getHour()<=5){
    												fixPause.setMinute(0);
    												stunden = op.subTime(stunden, fixPause);
    											}
    										}
    
    										stunden.ausgabe();														//Ausgabe Ergebnis
    									}
    									else
    										cout << "Sollstunden noch nicht erreicht!" << endl;
    
    									getchar();																	//Warten und Verlassen des Menüpunktes
    									system("cls");
    									break;
    
    							case 3:	pause = op.subTime(endPause, startPause);									//Endzeit (aktuelle zeit) - startzeit - Pause (pause wenn größer fixPause)
    
    									time(&rawtime);																//Setzen auf aktuelle Zeit
    									currTime = localtime(&rawtime);
    									endZeit.setMinute(currTime->tm_min);
    									endZeit.setHour(currTime->tm_hour);
    
    									stunden = op.subTime(endZeit, startZeit);									//Rechnung der aktuellen Stunden
    
    									if(stunden.getHour()>=2){
    										if(pause.getHour()>fixPause.getHour())									
    											stunden = op.subTime(stunden, pause);
    										else if(pause.getMinute()>fixPause.getMinute())
    											stunden = op.subTime(stunden, pause);
    										else{
    											if(stunden.getHour()>=6)
    												stunden = op.subTime(stunden, fixPause);
    											else if(stunden.getHour()<=5){
    												fixPause.setMinute(0);
    												stunden = op.subTime(stunden, fixPause);
    											}
    										}
    
    										stunden.ausgabe();														//Ausgabe Ergebnis
    									}
    									else
    										cout << "Sollstunden noch nicht erreicht!" << endl;
    
    									getchar();																	//Warten und Verlassen des Menüpunktes
    									system("cls");
    									break;
    
    							case 4: break;
    
    							default: cout << "Es wurde eine falsche Zahl eingegeben." << endl;
    
    									 getchar();
    									 system("cls");
    						}
    					}while(choice!=4);
    
    					break;
    
    			case 4: break;
    
    			default: cout << "Es wurde eine falsche Zahl eingegeben." << endl;
    
    					 getchar();
    					 system("cls");
    		}
    	}while(off!=1);																								//Wiederholen bis Menüpunkt "Beenden" ausgewäht wurde.
    
    	return 0;
    }
    


  • Hier fehlen offensichtlich die Definitionen der angemeckerten Funktionen. Er scheint nur deine main.cpp zu kompilieren. Kann es sein, dass du die anderen cpp-Dateien, die deine Klassen enthalten, gar nicht im Projekt hinzugefügt hast? Es reicht nicht, nur die Header zu inkludieren!

    Noch ein paar allgemeine Punkte:

    - Entweder include guards oder #pragma once. Beides brauchst du nicht.
    - Du verwechselst Deklaration und Definition.
    - getchar reicht eventuell nicht, nachdem schon Eingaben stattgefunden haben. Suche mal nach "Eingabepuffer leeren".
    - Arbeite an deiner Einrückung!



  • Ich habe die Klassen über die Oberfläche von Visual Studio in das Projekt mit eingebunden. Also über Rechtsklick auf "Projektmappen-Explorer->Hinzufügen->Klasse...". Reicht das nicht?

    Ich hatte zuerst nur die include guards im Projekt und aus Troubleshooting-Gründen hab ich versucht #pragma once noch hinzutzufügen. Programmiere nicht so häufig. Habs schon wieder rausgenommen.

    Danke für die Anmerkungen!


  • Mod

    Offensichtlichist die ownTime.cpp Datei nicht Teil des Projektes.

    Hast Du die wirklich in das Projekt eingefügt?



  • Meine Hand würd ich dafür nicht ins Feuer legen. Wenn nicht, was müsste ich dafür tun?


  • Mod

    Öffne Deine CPP Datei.

    Klicke auf File -> Move "Dateiname" -> "Solutionname"



  • Gut das ich das Programm in deutsch habe. Ich vermute mit "File" ist in der Menüleiste Datei gemeint. Mit "Move "Dateiname"" bin ich alleding schon überfordert.

    Wenn meine .cpp Datei in der Projektmappe angezeigt wird, die standardmäßig auf der Linken Seite zu finden ist, wurde die .cpp dem Projekt hinzugefügt?



  • In deinem Projektmappenexplorer klickst du einfach rechts auf das Projekt (oder einen untergeordneten Filter) => Hinzufügen => vorhandenes Element => [deine cpp-Datei auswählen].



  • Hmm ok dann sind die eindeutig schon eingebunden.


  • Mod

    Moment.
    Du kompilierst das ja mit der Hand... oder?

    Du benutzt ja gar kein Projekt.
    In dem Fall musst Du alle Compilierungs-Units in der Befehlszeileangeben.



  • Ahh OK ich bin jetzt weiter gekommen. Mit der Option "/Ob<n> klasse.obj" kann man die einzeilnen Units hinzufügen. Dadurch haben sich auch schon die Linker-Fehler reduziert.

    Ich hab nun das Problem das für die Klasse mathTime die .obj-File nicht existiert.
    Kann man das i-wie anstoßen?



  • Ach ne ich war zu voreilig. Als ich den Debug-Prozess in Visual Studio noch einmal gestartet habe wurde die Datei angelegt.

    Ich konnte mein Programm gerade bauen.

    Danke für die Hilfe!


Anmelden zum Antworten