Benutzer mit den meisten Antworten
unerklärlicher Linkerfehler

Frage
-
Hallo!
Ich habe ein Probelm bei dem ich absolut nicht weiter komme! Ich habe schon gegooglet aber leider nichts passendes gefunden. Außerdem ist es schwer das Problem zu definieren und Suchbegriffe zu finden.
Sinn und Zweck des ganzen ist das Auslagern häufig verwenderter Funktionen in ein separates File.
Um das Problem ggf. nachzustellen gebe ich hier mal eine kurze Anleitung wie ich dahin gekommen bin (in Klammern sind die zugehörigen Namen):
Neues WindowsFormsAnwendung-Projekt (Test)
Hinzufügen eines zweiten Formulars (FormMain)
Hinzufügen einer Headerdatei (Include) - zum Auslagern der Funktionen
in "Include.h" folgender Code (eine Dummy-Funktion die nichts macht - es geht um den Aufruf):namespace Test { void hi() {} }
Nun möchte ich gern die Funktion "hi()" in "Form1" und "FormMain" verwenden. Wenn ich nun "Include.h" in "Form1" include und die Funktion im Konstruktor aufrufe funktioniert alles wunderbar.
Probelm: Sobald ich dies in "FormMain" mache, kommt beim Erstellen folgende Fehlermeldung
1>FormMain.obj : error LNK2005: "void __clrcall Test::hi(void)" (?hi@Test@@$$FYMXXZ) ist bereits in Test.obj definiert.
Woran liegt das und wie kann ich dem Abhilfe schaffen?!
Danke für die Hilfe...
Antworten
-
Es gibt die Funktionin dem Namespace ja auch zweimal.
Richtig wäre es eine entsprechende Deklaration in einem der Header zu haben:namespace Test { void hi(); }
Und eine entsprechende Definition in einer der CPP Dateien.namespace Test { void hi() {} }
Dir muss klar sein, dass ein Header in mehrere Sourcen eingebunden wird, das heißt mitmeheren CPP Modulen zusammen kompiliert wird. Das reulstat ist, dass eben der Linker mehrere Definitionen findet und dies anmeckert.
Eine weitere Variante ist die entsprechende Funktion inline im Header zu definieren.
Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de- Als Antwort markiert Martin Richter Montag, 4. Mai 2009 07:19
- Tag als Antwort aufgehoben Martin Richter Montag, 4. Mai 2009 07:19
- Als Antwort vorgeschlagen Martin Richter Montag, 4. Mai 2009 07:19
- Als Antwort markiert Martin Richter Dienstag, 5. Mai 2009 05:59
Alle Antworten
-
Es gibt die Funktionin dem Namespace ja auch zweimal.
Richtig wäre es eine entsprechende Deklaration in einem der Header zu haben:namespace Test { void hi(); }
Und eine entsprechende Definition in einer der CPP Dateien.namespace Test { void hi() {} }
Dir muss klar sein, dass ein Header in mehrere Sourcen eingebunden wird, das heißt mitmeheren CPP Modulen zusammen kompiliert wird. Das reulstat ist, dass eben der Linker mehrere Definitionen findet und dies anmeckert.
Eine weitere Variante ist die entsprechende Funktion inline im Header zu definieren.
Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de- Als Antwort markiert Martin Richter Montag, 4. Mai 2009 07:19
- Tag als Antwort aufgehoben Martin Richter Montag, 4. Mai 2009 07:19
- Als Antwort vorgeschlagen Martin Richter Montag, 4. Mai 2009 07:19
- Als Antwort markiert Martin Richter Dienstag, 5. Mai 2009 05:59
-
Ich habe eine Lösung? gefunden...
Wenn ich die funktion als "static" definiere funktioniert alles!
Zumindest kommt kein Fehler mehr. Ich weiß jetz allerdings immer noch nicht den Grund. Über eine Erklärung würde ich mich sehr freuen.
Wenn Du eine Funktion im Header als static deklarierst wird der Code in jedes Modul erneut eingebunden. Das Schlüsselwort static begrenzt die Sichtbarkeit auf das aktuelle Modul.
Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de