Linker Fehler
-
Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) in das Forum C++/CLI mit .NET verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
SeppJ schrieb:
Typische Ursachen für doppelte Definitionen wären zum Beispiel Definitionen in Headern
ehm okay genau das habe ich auch getan...also ich hab eeine header die ich "variablen" genannt habe da ich globale variablen brauche da ich die variablen in verschiedenen quelldateien verwenden muss. Wo müsste ich diesen denn definieren?
naja mein Projekt besteht aus 6 quelldateien...wollt ihr wirklichen den ganzen quellcode haben?
SeppJ schrieb:
Du machst übrigens kein C++, sondern C++/CLI. Das ist eine ganz andere Sprache.
AHA ehm das ist ja interessant...das habe ich nicht beabsichtigt! ehm woran siehst du das? und hast du eine Idee wie es dazu kam?
viel dank für die hilfe
-
Im Header vor die globalen Variablen (solltest du dir eig. abgewöhnen) ein extern setzen (dadurch wird es zu einer Deklaration). Anschließend muss in genau einer .cpp-Datei die Variable definiert werden. Die Linkerfehler besagen eig. aber, dass es sich nicht um globale Variablen, sondern um Funktionen handelt, die mehrfach definiert wurden. Wobei Funktionen analog dazu sind.
Also:
variablen.hppextern void menü(array<String^>^); extern int globaleVariable;
menü.cpp
#include "variablen.hpp" void menü(array<String^>^) { ... /*definition der Funktion*/ globaleVariable*=3; ... } //menü() wird definiert, globale Variable wird nur verwendet
berechnung.cpp
#include "variablen.hpp" int globaleVariable = 3; // <- globale Variable wurde hiermit in berechnung.cpp definiert und initialisiert. menü(/*parameter*/); //Funktion aufrufen, die in menü.cpp definiert wurde
Wichtig ist, dass die tatsächliche Definition der Bezeichner nur in einer .cpp-Datei steht. Da die Header durch include nur in die .cpp-Dateien 1:1 kopiert werden, hast du automatisch eine Mehrfachdefinition, sobald du Funktionen/Variablen in Headern definierst, die von mehreren .cpp-Dateien inkludiert werden.
-
phil123 schrieb:
SeppJ schrieb:
Du machst übrigens kein C++, sondern C++/CLI. Das ist eine ganz andere Sprache.
AHA ehm das ist ja interessant...das habe ich nicht beabsichtigt! ehm woran siehst du das?
An den Typbezeichnern. Den Namensraum System gibt es in C++ nicht (und ich nehme mal an, dass du den nicht selber definiert hast) und auch kein '^' in Typenbezeichnern.
und hast du eine Idee wie es dazu kam?
Weil Microsoft C++/CLI gerne als C++ verkauft. Siehe übrigens auch:
http://www.c-plusplus.net/forum/263084
-
Also ich sollte die variablen nicht in der "variablen.h" sondern in der "variablen.CPP" definieren mit
double variable1=0
?
Und was kommt dann in die "variablen.h"?
-
Das hat Soley doch schon beschrieben (mit "extern"). Schau auch mal in Linkfehler 2005 und 1169 ...
-
tut mir echt leid jungs aber ich kapiers nicht
meine "variablen.h" ist jz das:
extern void variablen(); extern double a; //m1 extern double t; //t1 extern double b; //m2 extern double c; //t2 extern double x; // Koordinaten extern double y; // Koordinaten# extern int X; // Positionskoordinaten extern int Y;
und die "variablen.cpp":
#include "stdafx.h" double a=0; //m1 double t=0; //t1 double b=0; //m2 double c=0; //t2 double x=0; // Koordinaten double y=0; // Koordinaten# int X=0; // Positionskoordinaten int Y=0;
danke für die hilfe
-
extern
vor einer Funktion ist zwar nicht direkt falsch, aber zeigt irgendwie, dass du bloß blind abschreibst, anstatt dass du dich mal kundig gemacht hättest, wasextern
überhaupt bedeutet.Willst du wirklich globale Variablen benutzen? Sollen die wirklich allesamt nichtssagende, einbuchstabige Bezeichner haben? Noch dazu so Schätzchen wie
double x
undint X
? Und selbst die Kommentare, was die Bezeichner bedeuten sollen, sind kryptische, zweibuchstabige Kürzel . Das ist geradezu ein Lehrbuchbeispiel, wie man sich selber Probleme macht.
http://c2.com/cgi/wiki?GlobalVariablesAreBad
Deine Gründe fallen wohl allesamt unter das, was in dem Link als "very bad reasons" bezeichnet wird. Zu den einbuchstabigen Bezeichnern kann ich nicht einmal einen Link angeben. Leute diskutieren schon, ob man den Zähler einer innersten Schleife nicht besser loop_counter anstatt i nennen sollte. Die Idee dass jemand solche Bezeichner in globalen Kontexten benutzt, ist einfach unvorstellbar.
-
hm naja ich hab jetzt nochmal alles en bischen umgeschmissen und jz läufts etwas besser...
aber ich habe noch eine sehr wichtige Frage!Wie kann ich aus einer quelldatei "berechnung.cpp" eine dort berechnete variable an eine quelldatei "schnittpunkt.cpp" übergeben sodass ich dort mit dieser weiterrechnen kann?
egal wie ich es versuche bekomm ich immer einen error....
-
Ich sage dir, dass du nur Fehler bekommen wirst, wenn du globale Variablen nutzt und gleich deine nächste Frage ist zu einem Fehler, den du bekommst, weil du noch mehr globale Variablen nutzt?
Ansonsten noch:
http://www.c-plusplus.net/forum/304133
http://www.c-plusplus.net/forum/200753
http://www.tty1.net/smart-questions_de.html
Bitte alle gründlich lesen! Wir wissen nicht, was du getan hast. Wir wissen nicht, was du vor hast. Wir wissen nicht, was bei dir nicht funktioniert (Du bekommst "einen error". Tolle Information!).