multiple definition of `test::testing::GetX()'
-
morgaehn leute
folgendes problem:
folgender code wird vom MinGW nicht genommen:namespacetest.h
#ifndef namespacetestH #define namespacetestH namespace test { class testing { private: int x; public: int GetX(void); }; } #endif
namespacetest.cpp
#ifndef NamespaceTestCpp #define NamespaceTestCpp #include "namespacetest.h" int test::testing::GetX(void) { return x; } #endif
demo.cpp
#include <stdio.h> #include "namespacetest.cpp" int main(void) { test::testing h; printf("%i", h.GetX()); }
Fehlermeldungen:
demo.cpp demo.cpp:9:2: warning: no newline at end of file Linking... K:\Txl\namespace\demo\Debug\namespacetest.o(.text+0x0): In function `ZN4test7testing4GetXEv': K:\Txl\namespace\demo\namespacetest.cpp:9: multiple definition of `test::testing::GetX()' K:\Txl\namespace\demo\Debug\demo.o(.text+0x0):K:\Txl\namespace\demo\namespacetest.cpp:9: first defined here demo.exe - 2 error(s), 1 warning(s)
kann mir jemand sagen, was da los ist ?
und kann man dem developer studio irgendwie beibringen, das man die fehlermeldungen auch mit Ctrl-C kopieren kann und nicht mit der doofen maus ?Meep Meep
-
man includiert keine cpp in der main-cpp
#include "namespacetest.cpp"
nur den header.
die implementierungs - cpp braucht auch keine includewächter.
so long
-
Naja, Du includest ein cpp-File. Das bringt eine Definition der Funktion mit. Außerdem hast Du das cpp-File vermutlich in Dein Projekt mit eingebunden. Es wird also mitübersetzt und erzeugt ebenfalls eine Definition der Funktion. Dadurch hat der Linker zwei und kann sich nicht entscheiden.
Einfach Lösung: niemals eine cpp-Datei includen.
-
jetz hab ich anstatt der namespacetest.cpp die namespacetest.h eingebunden. jetz kommt:
demo.cpp demo.cpp:9:2: warning: no newline at end of file Linking... K:\Txl\namespace\demo\Debug\demo.o(.text+0x29): In function `main': K:\Txl\namespace\demo\demo.cpp:8: undefined reference to `test::testing::GetX()' demo.exe - 1 error(s), 1 warning(s)
ansonsten hab ich immer den BCB verwendet. und da hab ich immer die cpp eingebunden. da hats noch nie ne meldung gegeben.
demo.cpp:9:2: warning: no newline at end of file <- find ich auch lustig. ich kann ja kein unendlich grosses file machen, nur damit er nach dem dateiende noch ne zeile findet. oder hat in der programmierung dateiende eine andere bedeutung ? *gMeep Meep
-
Die Warnung heißt einfach, daß Du kein newLine am Ende Deiner Datei hast. Einfach reingehen, ganz ans Ende und einmal fest auf die Return-Taste hauen!
Du mußte natürlich die andere cpp-Datei mitübersetzen. Und die beiden Kompilate dann zusammenlinken.
MfG Jester
-
hab bis jetz noch nie haendisch etwas kompiliert.
koenntest du mir bitte mal anhand der drei dateien zeigen wie ich das selbst mache ?gcc demo.cpp namespacetest.cpp namespacetest.h
wird wohl nicht funktionieren
Meep Meep
-
Probier's mal mit
g++ demo.cpp namespacetest.cpp
das sollte afaik funktionieren.
Du solltest Dich mal ne Runde mit dem Übersetzungsmodell von C++ beschäftigen. Dann passieren so Sachen wie cpp einbinden oder header kompilieren nicht.
Kostet nicht viel zeit, aber gehört einfach dazu wenn man mit C++ arbeiten will/muß.
-
nimm auch nochmal die includewächter um die implementierungsdatei raus.
-
warum sollte ihn der includewaechter in der cpp stoeren ?
naja egaljetz hab ichs mal einfach mal nur mit includieren der header gemacht und das dann mit hand compilieren pobiert.
folgender source:
message.cpp
inline Message::Message(void) { } inline Message::~Message(void) { } inline void Message::Show(const char *t_caption,const char *t_text,HANDLE t_handle) { MessageBox(0,t_text,t_caption,MB_OK); }
message.h
#ifndef MessageH #define MessageH #include <windows.h> class Message { private: // Methoden // Variablen void *handle; public: // Konstruktor und Destruktor inline Message(void); inline ~Message(void); // Operatoren // Methoden inline void Show(const char *t_caption,const char *t_text,HANDLE t_handle = 0); // Variablen }; #endif
main.cpp
compiliert mit:
gcc demo.cpp message.cpp
dann bekomm ich folgende fehlermeldung:
message.h:16: warning: inline function `Message::Message()' used but never defined message.h:17: warning: inline function `Message::~Message()' used but never defined message.h:22: warning: inline function `void Message::Show(const char*, const char*, void*)' used but never defined message.cpp:1: error: syntax error before `::' token message.cpp:5: error: syntax error before `::' token message.cpp:10: error: syntax error before `::' token
mit dem bcb hat das eigendlich immer geklappt. wo liegt da der fehler ?
oder waere es gescheiter wenn ich mich nochmal fuer 2-3 jahre ins bett lege. vielleicht bin ich dann ausgeschlafen genug *gruebelMeep Meep
-
methoden, die inline sind, müssen in dem header mit definiert werden.
inlines sind meist überflüssig. compiler sind klug.
-
@elise:
danke fuer die antwort.
der compiler von borland scheint dann so ziemlich das ueberlste zu sein, was so am markt ist. der hat sich darueber noch nie aufgeregt. bin grad draufgekommenm das ich mit dem gcc fast nix kompilieren kann, was mit dem bcb anstandslos funktioniert hatMeep Meep