C++ LNK Fehler

KingJoshii1000

Lieutenant
Registriert
Apr. 2010
Beiträge
879
Hallo,
ich bekomme seit heute bei 2 Projekten andauernt Linker Fehler.
Kurz vorweg, der Code ist für eine Übung gedacht, um Pass-By-Value, Pass-By-Reference und Pass-By-Const-Reference zu verdeutlichen, daher ist es relativ "schlicht" gehalten. Ich habe 3 Dateien, davon 2 .cpp und eine .h. Kurz zu den Funktionen, diese sollen erhaltene Parameter tauschen, sprich a = 0, b = 1 swap(a,b) ergibt dann als ausgabe 1,0.
Folgende Fehlermeldung erhalte ich jedoch nach dem kompilieren:

Fehler 1 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""void __cdecl swap_nr::swap_v(int,int)" (?swap_v@swap_nr@@YAXHH@Z)" in Funktion "_main".
Fehler 2 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""void __cdecl swap_nr::swap_r(int &,int &)" (?swap_r@swap_nr@@YAXAAH0@Z)" in Funktion "_main".

Header.h
Code:
#include "..\..\std_lib_facilities.h";
namespace swap_nr{
	void swap_v(int, int);
	void swap_r(int&, int&);
	void swap_cr(const int&, const int&);
}
swap.cpp
Code:
#include "Header.h";
void swap_v(int a, int b){
	int temp;
	temp = a;
	a = b;
	b = temp;
	cout << a << " " << b << endl;
}
void swap_r(int& a, int& b){
	int temp;
	temp = a;
	a = b;
	b = temp;
	cout << a << " " << b << endl;
}
/* Auskommentiert, weil es nicht funktioniert */
//void swap_cr(const int& a, const int& b){
//	int temp;
//	temp = a;
//	a = b;
//	b = temp;
//}
Main.cpp
Code:
#include "Header.h";
using namespace swap_nr;
int main(){
	int x = 7;
	int y = 9;
	swap_v(x, y);
	swap_r(x, y);
	keep_window_open();
}

Habe diesen LNK Fehler noch nie bekommen, daher bin ich etwas ratlos :(.

Wünsche noch einen schönen Restsonntag

Mit freundlichen Grüßen
 
In der swap.cpp hast Du die Funktionen nicht im namespace swap_nr implementiert.
 
Hallo,
du hast vollkommen recht, jedoch hat mir Intellisense dort keinen Fehler ausgeworfen und der Compiler auch nicht, daher habe ich das ausgeschlossen.

Hab vielen Dank es funktioniert wunderbar. So ein simpler Fehler kostet einem 1 Stunde suchen :(.

Mit freundlichen Grüßen
 
Der Compiler findet den Fehler nicht, weil es aus seiner Sicht keiner ist; Du könntest theoretisch ja die Funktionen im und außerhalb des Namespaces definieren, oder auch in einer anderen cpp Datei. Erst der Linker merkt, dass keins Deiner Module die passende Definition enthält.
 
KingJoshii1000 schrieb:
Hallo,
du hast vollkommen recht, jedoch hat mir Intellisense dort keinen Fehler ausgeworfen und der Compiler auch nicht, daher habe ich das ausgeschlossen.

Hab vielen Dank es funktioniert wunderbar. So ein simpler Fehler kostet einem 1 Stunde suchen :(.

Mit freundlichen Grüßen

1. Intellisense kannst du in dieser Hinsicht vergessen. Du kannst froh sein, wenn Intellisense bei komplizierteren Konstrukten deinen Code überhaupt noch parsen kann und nicht einfach das Handtuch wirft. Auf jeden Fall heißt die Tatsache, daß Intellisense keinen Fehler gefunden hat, erst mal noch gar nichts.
2. Es ist ja auch kein Compiler-Fehler sondern ein Linker-Fehler. Wieso erwartest du, daß der Compiler dich auf Fehler hinweist, die erst zum Zeitpunkt des Linkens auftreten?
Konkret zum deinem Fall: Du hast in deiner .cpp eben 3 neue Funktionen swap_v, swap_r und swap_cr eingeführt, die aber eben im globalen Namespace liegen und mit swap_nr::swap_v, swap_nr::swap_r und swap_nr::swap_cr nix zu tun haben. Der Compiler denkt sich dann eben, aha, 3 neue Funktionen ... na gut, warum nicht? Dann kommt aber der Linker und fragt sich, hey wo sind jetzt eigentlich die Definitionen der Funktionen swap_v, swap_r und swap_cr, die der gute KingJoshii in seinem Header deklariert (und woanders im Code auch benutzt) hat?
 
Hallo,
danke für die kleine Aufklärung, jetzt habe ich den Fehler auch verstanden. Habe mich da wohl wirklich zu sehr auf Intellisense verlassen. Durch eure Erklärung leuchtet is mir auch ein, warum es kein Compilerfehler ist.

Mit freundlichen Grüßen
 
Zurück
Oben