Multiple Definition, die gar keine ist
-
Ich hab das grad mal durchgelesen, das ist aber scheinbar nur für Klassendefinitionen oder header-Dateien. Ich binde die .cpp-Quelltexte ein, da passt das doch nicht, oder? Und wenn, wie?
#include <C:/XXX/Konfiguration_laden.cpp> #include <C:/XXX/Spielfeld_skalieren.cpp> #include <SDL/SDL.h> using namespace std;
So in der Art sehen meine Dateianfänge aus. Und das habe ich schon mehrmals kontrolliert, außer <fstream> und <SDL/SDL.h> wird nichts mehrfach oder sogar verschachtelt geladen. Da jede meiner Dateien eine Funktion darstellt, wäre das includen einer Datei in der einer Funktion ja eine neue Funktionsdefinierung in der Funktion und das geht ja eh nicht.
Aber danke schonmal für die Hilfe
-
cpp dateien werden nicht inkludiert.
nur header dateien. und die auch nur wenns sein muss, sonst wird vorwärtsdeklariert.
Simon
-
Ich binde die .cpp-Quelltexte ein, da passt das doch nicht, oder? Und wenn, wie?
omg... Wo lernt man denn so etwas?
du includierst nur die *.h - die *.cpp beinhalten die implementationen und binden zuvor den jeweiligen header ein
der compiler compiliert die *.cpp dateien von allein und linkt das dann halt...
wenn du die *.cpp selbst includest, ist es klar, dass er sich beschwert, weil er die schon kennt...bb
-
Little Programmer schrieb:
Ich hab das grad mal durchgelesen, das ist aber scheinbar nur für Klassendefinitionen oder header-Dateien. Ich binde die .cpp-Quelltexte ein, da passt das doch nicht, oder? Und wenn, wie?
#include <C:/XXX/Konfiguration_laden.cpp> #include <C:/XXX/Spielfeld_skalieren.cpp> #include <SDL/SDL.h> using namespace std;
Das ist leider grober Unfug, was du da machst
Ich empfehle, den Abschnitt bezüglich compilierung mit mehreren Source-Dateien im Buch/Tutorial deiner Wahl nochmal genauer zu studieren.
-
Aber wie mache ich das sonst? Soll ich einfach die XXX.cpp in eine XXX.h umbenennen, die die Funktion enthält?
Edit: Grad beim schreiben kam unten noch der post von unskilled.
Bedeutet das, dass ich einfach nur die SDL und fstream Header einbinde und wenn ich Funktionen aus anderen XXX.cpp Dateien im Projekt verwende, erkennt der Compiler dies automatisch?
-
du fügst in deiner ide die *.cpp dateien dem projekt hinzu...
damit werden die schon mal _immer_ compiliertund wenn du deren funktionalität brauchst, included du den jeweiligen header - und nach dem fertig compilieren, linkt der linker die aufrufe eben richtig...
bb
-
Ich schein ja einiges falsch zu machen
.
wenn du deren funktionalität brauchst, included du den jeweiligen header
Das versteht ich jetzt nicht. Wnn ich z.B. folgende (Pseudocode-)Dateien habe:
main.cpp
#include <SDL/SDL.h> int main() { funktion(); }
funktion.cpp
#include <SDL/SDL.h> void funktion(void) { zweiteFunktion(); //tut etwas }
zweiteFunktion.cpp
#include <SDL/SDL.h> void zweiteFunktion(void) { //tut etwas }
Wenn diese Dateien zu einem Projekt gehören, kann ich das Projekt dann einfach direkt kompilieren oder was für "jeweilige" Header sind das, die ich dann einbinden müsste, damit die Verlinkung klappt?
-
Nein, die Header fehlen
function.hpp
#ifndef FUNCTION_HEADER_GUARD__ #define FUNCTION_HEADER_GUARD__ // Deklaration void function(); #endif // FUNCTION_HEADER_GUARD__
function.cpp
#include "function.hpp" // Definition void function() { // ... }
main.cpp
#include "function.hpp" int main() { function(); return 0; }
Jetzt musst du function.cpp kompilieren und beim Kompilieren von main.cpp das Objectfile, welches beim kompilieren von function.cpp enstanden ist, dazulinken. In einer vernünftigen IDE passiert dies automatisch
Grüssli
-
Hi,
sieht aus, als hättest Du bislang einfach gar keine Header.
Die solltest Du schleunigst bauen und einsetzen:Neu:
funktion.h
#ifndef FUNKTION_H #define FUNKTION_H void funktion(void); #endif // FUNKTION_H
zweiteFunktion.h
#ifndef ZWEITEFUNKTION_H #define ZWEITEFUNKTION_H void zweiteFunktion(void); #endif // ZWEITEFUNKTION_H
Da wo Du die Funktionen definierst
: die "eigenen Header" (wegen der "Schnittstellenkonsistenz") und
: die Header der Funktionalitäten, die Du für die Implementierung brauchst:funktion.cpp
#include "funktion.h" #include <SDL/SDL.h> // falls Du wirklich SDL noch bei "tut was" brauchst #include "zweiteFunktion.h" void funktion(void) { zweiteFunktion(); //tut etwas }
zweiteFunktion.cpp
#include "zweiteFunktion.h" #include <SDL/SDL.h> void zweiteFunktion(void) { //tut etwas }
und schließlich da, wo Du die FUnktionen verwenden willst:
main.cpp
#include "funktion.h" int main() { funktion(); return 0; }
Gruß,
Simon2.
P.S.: Da war ich halt später als Dravere ....
-
Danke für eure Hilfe. Langsam versteh ich es. ich muss also in den Header-Datein immer nur den Funktionsnamen und die zu übergebenden Variablen deklarieren und den Teil mit den geschweiften Klammern benutzte ich nur in der *.cpp, oder?
Edit: Rest der Frage hat sich erledigt, hatte was falsch gelesen
.
-
Hiermit: http://de.wikibooks.org/wiki/C%2B%2B-Programmierung/_Weitere_Grundelemente/_Headerdateien
Hab ich es jetzt endlich verstanden. Ich danke euch nochmal vielmals! Ohne euch hätte ich immer so weiter gemacht, wie bisher :(.
-
Little Programmer schrieb:
...Hab ich es jetzt endlich verstanden. Ich danke euch nochmal vielmals! ...
Sehr gern geschehen!! Für sowas liebe ich das Forum (sowohl als Fragesteller als auch als Antwortengeber).
Ich habe hier auch schon sehr viel gelernt - so viel, dass meine Kollegen schon sagen: "Du immer mit Deinem C++! Damit kann man anscheinend alles!"... und sehr schön, dass Du uns noch das Feedback gegeben hast.
Gruß,
Simon2.
-
Simon2 schrieb:
Sehr gern geschehen!! Für sowas liebe ich das Forum (sowohl als Fragesteller als auch als Antwortengeber).
Ich habe hier auch schon sehr viel gelernt - so viel, dass meine Kollegen schon sagen: "Du immer mit Deinem C++! Damit kann man anscheinend alles!"... und sehr schön, dass Du uns noch das Feedback gegeben hast.
Jup, so macht das Forum Spaß und Sinn
Mir gehts ähnlich mit dem Lernen - und mit den Kollegen. Inzwischen kommen sie mit C++-Fragen zu mir. Und mit etwas Glück werd ich nächste Woche zur Partnerfirma versetzt wo sie C++-Entwickler brauchen, weg von Java *juhu*. Und nein, ich hab nichts gegen Java. Mir macht nur C++ mehr Spaß. Das ist persönliche Geschmackssache und sollte jetzt niemanden dazu anmieren hier den (n+1)ten Java-vs-C++-Flamewar vom Zaun zu brechen...