 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Dominik Dell Guest
|
Posted: Mon Apr 05, 2004 1:15 pm Post subject: Code auf mehrere Dateien verteilen? |
|
|
Hallo,
bin relativer C++ Anfaenger. Zumindest habe ich gerade mein erstes
Projekt. Meine Quellcode-Datei wird langsam etwas gross und
unuebersichtlich und ich wuerde gerne ein paar Funktionen in separate
Dateien auslagern.
Mir ist noch nicht ganz klar, wie man das ueblicherweise organisiert,
denn ich kriege beim Compilieren Probleme mit fehlenden Header-Dateien.
Also konkret, angenommen ich habe meinen gesamten Code in program.cpp in
folgender Struktur:
include-Dateien
Klassendeklaration
Prototypen
main
Funktionen
Angenommen, ich schreibe jetzt eine Funktion, namens funktion1() in eine
separate Datei funktion1.cpp und gebe diese beim Kompilieren mit an,
dann kriege ich eine Fehlermeldung, die daher ruehrt, dass die
entsprechende Bibliotheks-Header-Datei (sagen wir biblio.h), die in
programm.cpp eingebunden wird, nicht beruecksichtigt wurde (die aber von
funktion1() benoetigt wird). Wenn ich diese aber am Anfang von
funktion1.cpp einbinde, funktioniert es genau so wenig.
Macht meine Vorgehensweise Sinn? Wie organisiert man das normalerweise?
Merci
Dominik
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Christoph Rabel Guest
|
Posted: Mon Apr 05, 2004 2:26 pm Post subject: Re: Code auf mehrere Dateien verteilen? |
|
|
Dominik Dell wrote:
| Quote: | Mir ist noch nicht ganz klar, wie man das ueblicherweise organisiert,
denn ich kriege beim Compilieren Probleme mit fehlenden Header-Dateien.
Also konkret, angenommen ich habe meinen gesamten Code in program.cpp in
folgender Struktur:
include-Dateien
Klassendeklaration
|
Klassendeklarationen solltest du in den/die Header geben.
dito.
| Quote: | main
Funktionen
Angenommen, ich schreibe jetzt eine Funktion, namens funktion1() in eine
separate Datei funktion1.cpp und gebe diese beim Kompilieren mit an,
dann kriege ich eine Fehlermeldung, die daher ruehrt, dass die
entsprechende Bibliotheks-Header-Datei (sagen wir biblio.h), die in
programm.cpp eingebunden wird, nicht beruecksichtigt wurde (die aber von
funktion1() benoetigt wird). Wenn ich diese aber am Anfang von
funktion1.cpp einbinde, funktioniert es genau so wenig.
|
Warum nicht?
Wir brauchen mehr Input um dir zu helfen. Am besten postest du erstmal
die Fehlermeldungen und falls der Code kurz genug ist auch diesen bzw.
du versuchst die relevanten Teile zu posten.
| Quote: | Macht meine Vorgehensweise Sinn? Wie organisiert man das normalerweise?
|
Ja, das passt glaube ich schon so was du vorhast. Ich vermute es
scheitert eher an den Details...
mfg
Christoph
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Wolfgang Kaufmann Guest
|
Posted: Mon Apr 05, 2004 6:51 pm Post subject: Re: Code auf mehrere Dateien verteilen? |
|
|
* Thus spoke Dominik Dell <dell (AT) lpsc (DOT) in2p3.fr>:
Hallo,
| Quote: | bin relativer C++ Anfaenger. Zumindest habe ich gerade mein erstes
Projekt. Meine Quellcode-Datei wird langsam etwas gross und
unuebersichtlich und ich wuerde gerne ein paar Funktionen in separate
Dateien auslagern.
Mir ist noch nicht ganz klar, wie man das ueblicherweise organisiert,
denn ich kriege beim Compilieren Probleme mit fehlenden Header-Dateien.
|
Hier ein Minimal-Beispiel das Dir vielleicht weiterhilft:
Datei: foo.hpp
| Quote: | ifndef FOO_HPP__INCLUDED
#define FOO_HPP__INCLUDED
#include
char funktion1(const std::string text, int index);
#endif
|
Datei: foo.cpp
| Quote: | #include "foo.hpp"
char funktion1(const std::string text, int index) {
return text.at(index);
}
|
Datei: foo-main.cpp
| Quote: | #include "foo.hpp"
#include
int main() {
std::string text("einszweidrei");
int index = 4;
std::cout << "An Stelle: " << index << " des Strings " << text
" steht: " << funktion1(text, index) << std::endl;
}
|
Übersetzen bsp. mit:
$ g++ -Wall foo-main.cpp foo.cpp -o foo-programm
Wolfgang.
--
"If you've a highlighter pen, these lines above have got to be marked."
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Dominik Dell Guest
|
Posted: Thu Apr 08, 2004 4:00 pm Post subject: Re: Code auf mehrere Dateien verteilen? |
|
|
Hallo,
Danke fuer die Tipps, die Links zu dem Tutorial waren sehr hilfreich.
Ich habe jetzt meine Funktionen auf mehrere *.cpp-Dateien verteilt, das
ganze mit einer Header-Datei, die folgendermassen aussieht:
#ifndef program_hpp_INCLUDED
#define program_hpp_INCLUDED
[Include-Dateien]
[Klassen-Deklaration]
[Funktions-Prototypen]
#endif
Die Header-Datei habe ich in alle *.cpp-Dateien eingebunden (include)
und es funktioniert einwandfrei.
Jetzt ist es doch aber wahrscheinlich sinnvoll und auch uebersichtlicher
fuer jede *.cpp-Datei auch eine eigene *.hpp-Datei zu erstellen. Das
habe ich versucht. Und wieder in mehrere *.cpp-Dateien eingebunden, da
sonst vom Compiler (g++) die Fehlermeldung kam, dass er irgendwelche
Funktionen noch nicht kennt. Wenn ich das aber tue, dann kriege ich eine
Fehlermeldung vom Typ "multiple definiton of" (genaues siehe unten).
Ich habe natuerlich in alle *.hpp-Dateien Praeprozessor-Anweisungen von
obigem Typ eingebaut, die ja eigentlich verhindern sollten, dass
irgendwas mehrfach eingebunden wird. Was mache ich dabei noch falsch?
Fehlermeldungen:
$ make qg2sn
g++ -o a qg2sn.cpp vegas.cpp integrand.cpp display.cpp pdf.o
.../../gsl/.libs/libgsl.a -lm
-L/utils/cern/2003/lib -lpacklib -lpdflib804 -lmathlib -lkernlib
-lg2c
/tmp/cckGYAp3.o: In function `variable_transformation(double *, Param,
double &, double &, double &, double &)':
/tmp/cckGYAp3.o(.text+0x0): multiple definition of
`variable_transformation(double *, Param, double &, double &, double &,
double &)'
[...]
/tmp/cckGYAp3.o: In function `integrand(double *, unsigned int, void *)':
/tmp/cckGYAp3.o(.text+0x60c): multiple definition of `integrand(double
*, unsigned int, void *)'
/tmp/ccf3skmg.o(.text+0x60c): first defined here
collect2: ld returned 1 exit status
make: *** [qg2sn] Error 1
Aufbau von integrand.hpp:
#ifndef integrand_hpp_INCLUDED
#define integrand_hpp_INCLUDED
double integrand (double *k, size_t dim, void *para);
void variable_transformation(double x[3], Param p, double &xa, double
&xb, double &t, double &djac);
[weitere Prototypen]
#endif
Danke
Dominik
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Rolf Magnus Guest
|
Posted: Sun Apr 11, 2004 2:05 pm Post subject: Re: Code auf mehrere Dateien verteilen? |
|
|
Dominik Dell wrote:
| Quote: | Hallo,
Danke fuer die Tipps, die Links zu dem Tutorial waren sehr hilfreich.
Ich habe jetzt meine Funktionen auf mehrere *.cpp-Dateien verteilt,
das ganze mit einer Header-Datei, die folgendermassen aussieht:
#ifndef program_hpp_INCLUDED
#define program_hpp_INCLUDED
[Include-Dateien]
[Klassen-Deklaration]
[Funktions-Prototypen]
#endif
Die Header-Datei habe ich in alle *.cpp-Dateien eingebunden (include)
und es funktioniert einwandfrei.
Jetzt ist es doch aber wahrscheinlich sinnvoll und auch
uebersichtlicher fuer jede *.cpp-Datei auch eine eigene *.hpp-Datei zu
erstellen.
|
Das ist richtig. Das sollte man grundsätzlich tun.
| Quote: | Das habe ich versucht. Und wieder in mehrere *.cpp-Dateien
eingebunden, da sonst vom Compiler (g++) die Fehlermeldung kam, dass
er irgendwelche Funktionen noch nicht kennt. Wenn ich das aber tue,
dann kriege ich eine Fehlermeldung vom Typ "multiple definiton of"
(genaues siehe unten). Ich habe natuerlich in alle *.hpp-Dateien
Praeprozessor-Anweisungen von obigem Typ eingebaut, die ja eigentlich
verhindern sollten, dass irgendwas mehrfach eingebunden wird.
|
Nur innerhalb einer Übersetzungseinheit.
| Quote: | Was mache ich dabei noch falsch?
|
Mit den Informationen ist das schwer zu sagen.
| Quote: |
Fehlermeldungen:
$ make qg2sn
g++ -o a qg2sn.cpp vegas.cpp integrand.cpp display.cpp pdf.o
../../gsl/.libs/libgsl.a -lm
-L/utils/cern/2003/lib -lpacklib -lpdflib804 -lmathlib -lkernlib
-lg2c
/tmp/cckGYAp3.o: In function `variable_transformation(double *, Param,
double &, double &, double &, double &)':
/tmp/cckGYAp3.o(.text+0x0): multiple definition of
`variable_transformation(double *, Param, double &, double &, double
&, double &)'
|
Der Compiler findet offensichtlich mehrere Implementationen der Funktion
varaible_transformation. Wenn du jedes File einzeln compilierst und
erst am Schluß alles linkst (Was eh besser ist), stehen statt den
kryptischen Filenamen (/tmp/cckGYAp3.o) welche, die dir sagen, wo die
Mehrfachdefinition steckt.
| Quote: | [...]
/tmp/cckGYAp3.o: In function `integrand(double *, unsigned int, void
*)': /tmp/cckGYAp3.o(.text+0x60c): multiple definition of
`integrand(double *, unsigned int, void *)'
/tmp/ccf3skmg.o(.text+0x60c): first defined here
collect2: ld returned 1 exit status
make: *** [qg2sn] Error 1
Aufbau von integrand.hpp:
#ifndef integrand_hpp_INCLUDED
#define integrand_hpp_INCLUDED
double integrand (double *k, size_t dim, void *para);
void variable_transformation(double x[3], Param p, double &xa, double
&xb, double &t, double &djac);
[weitere Prototypen]
#endif
|
Sieht soweit ok aus.
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|