C++ Anfänge - Verweis auf nicht aufgelöstes externes Symbol...



  • Guten Abend Zusammen,

    wir behandeln aktuell C++ in der Hochschule und haben dazu Übungsaufgaben bekommen.
    Bei einer Aufgabe sollen wir eine Funktion mit dem Namen max erstellen, dessen Rückgabetyp sowie Eingabeparameter a und b nicht-negative Zahlen sind.
    Der größere Wert von Beiden soll zurückgeliefert werden.
    Die Funktion soll in eine seperate Header und Source file ausgelagert werden, und die Funktion max soll in einem Namensraum mit der Bezeichnung math liegen.
    Soweit so gut, folgend mein Ansatz, welcher auch soweit das getan hat was er sollte, jedoch scheitere ich nun bei der Aufteilung in Header und Source, da ich folgende zwei Fehlermeldungen bekomme:

    LNK2019 Verweis auf nicht aufgelöstes externes Symbol ""int_cdecl math::max(int,int)" (?max@math@@YAHHH@Z)" in Funktion "main".
    LNK1120 1 nicht aufgelöste Externe.

    Meine Klassen + Code sind wie folgt:

    Main.cpp:

    #include <iostream>
    #include "maxFunctionHeader.h"
    
    using namespace std;
    using namespace math;
    
    int main()
    {
    	max(3, 4);
    	return 0;
    }
    

    maxFunction.cpp :

    #include <iostream>
    #include "maxFunctionHeader.h"
    
    using namespace std;
    
    
    
    	int max(int a, int b)
    	{
    		int c = 0;
    
    		if (a < 0)
    			a = a * (-1);
    		else if (b < 0)
    			b = b * (-1);
    
    		if (a > b)
    		{
    			c = a;
    			cout << a << endl;
    			return c;
    		}
    		else if (b > a)
    		{
    			c = b;
    			cout << b << endl;
    			return c;
    		}
    		else
    		{
    			cout << "Zahlen sind gleich" << endl;
    			return 0;
    		}
    
    		
    	}
    

    maxFunctionHeader.h :

    #ifndef MAXFUNCTIONHEADER_H
    #define MAXFUNCTIONHEADER_H
    
    #include <iostream>
    
    namespace math
    {
    	
    	int max(int a, int b);
    }
    
    
    #endif
    

    .

    Danke für eure Hilfe, bin für jede Art von Hilfe und Ratschlägen offen!

    Mit freundlichen Grüßen,
    Tobias.



  • @tobi9595

    namespace math

    Fällt dir da etwas auf?



  • @tobi9595 Schreib' bitte in eine Zeile vor Deinem Code ``` und in eine Zeile nach deinem Code ```. Alternativ markiere Deinen Code und klicke auf das </> über dem Bearbeitungsfenster. Den Link zum Bearbeiten Deines Beitrags findest Du rechts unter Deinem Beitrag in dem Drei-Punke-Menü.

    Hat nichts mit der Fehlermeldung zu tun (dafür siehe @manni66) aber dein math::max() ist ein abs() und ein max() in einem. Nicht so schön. Siehe SRP.



  • @Swordfish

    Danke für den Tipp, habe ich überarbeitet.
    Die Bezeichnungen haben wir so vorgegeben bekommen, ich werde mir dennoch mal deine Verlinkung anschauen.

    Vielen Dank!



  • Moin @manni66 ,

    kann ich so leider nicht sagen, auf was möchtest du hinaus?

    Viele Grüße!



  • @tobi9595
    Es kommt nur in einer Datei vor.



  • Dieser Beitrag wurde gelöscht!


  • @manni66

    Also ich eröffne den Namensraum in maxFunctionHeader.h, wobei ich das Grundgerüst der Funktion festlege. Ausformuliert wird diese anschließend in maxFunction.cpp .
    Diesen Namensraum rufe ich in Main.cpp ja wieder auf, sodass ich die Funktion theoretisch ohne math::max verwenden kann.
    Wie meinst du denn dass der nur in einer Datei vorkommt, was müsste ich anpassen?



  • Das im Header ist eine Funktionsdeklaration, das im Source-File (.cpp) ist eine Funktionsdefinition. Die Deklaration von max() ist im namespace Namens math, die Deklaration aber nicht, also ist die im Source-File definierte Funktion max() eine andere als die im Header deklarierte Funktion math::max().

    Das sagt dir mit

    LNK2019 Verweis auf nicht aufgelöstes externes Symbol ""int_cdecl math::max(int,int)" (?max@math@@YAHHH@Z)" in Funktion "main".
    

    auch Dein Linker: math::max() ist undefiniert.



  • @Swordfish

    Alles klar, dankeschön, das leuchtet mir jetzt ein, dann muss ich also die Funktion in maxFunction.cpp auch mit in den namespace nehmen.
    Ich habe mich an folgendem Beispiel welches ich gefunden habe orientiert, aus welchen Gründen ist dort kein weiterer namespace erforderlich?

    main.cpp

    #include <iostream>
    #include "add.h"
    
    using namespace std;
    
    int main()
    {
        cout << "The sum of 3 and 4 is" << add(3,4) << endl;
        return 0;
    }
    

    add.cpp

    #include "add.h"
    
    int add(int x, int y)
    {
        return x+y;
    }
    

    add.h

    #ifndef ADD_H
    #define ADD_H
    
    
    int add(int x, int y);
    
    
    #endif // ADD_H
    

    .

    Viele Grüße & dankeschön!



  • @tobi9595 sagte in C++ Anfänge - Verweis auf nicht aufgelöstes externes Symbol...:

    aus welchen Gründen ist dort kein weiterer namespace erforderlich?

    Weil man Funktionen oder sonstwas nicht in Namespaces stecken muss.

    Das da:

    @tobi9595 sagte in C++ Anfänge - Verweis auf nicht aufgelöstes externes Symbol...:

    using namespace std;
    using namespace math;
    

    ist übrigens mit Vorsicht zu genießen weil das alle Symbole der Namespaces std und math in den globalen Namespace "ausschüttet". In std gibt es (den richtigentm Header inkludiert) auch ein max().

    Man kann auch einzelne Symbole in den aktuellen Namensraum bringen:

    using std::cout;
    using math::max;
    


  • @Swordfish Alles klar, super ich danke dir!!!
    Ich konnte den Fehler auch bei dem nachträglich Code nachstellen, ich denke ich habe es verstanden!
    Danke euch!



  • Ach so, nebenbei: Visual Studio wäre auf Englisch nicht verkehrt. Dann spuckt der Compiler/Linker cl.exe ein wenig verständlichere und leichter googlebare Fehlermeldungen aus.


  • Mod

    @Swordfish sagte in C++ Anfänge - Verweis auf nicht aufgelöstes externes Symbol...:

    Ach so, nebenbei: Visual Studio wäre auf Englisch nicht verkehrt. Dann spuckt der Compiler/Linker cl.exe ein wenig verständlichere und leichter googlebare Fehlermeldungen aus.

    Oder sonst nur nach der Fehlernummer + "error" suchen, und die deutschen Begriffe weglassen.



  • oder einfach nochmal einen blick ins buch werfen und vergleichen.


Anmelden zum Antworten