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!
-
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?
-
Ö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.
-
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!