Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Quell- und Headerdateien Problem

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
16.08.2003, 23:06 Uhr
~unwissender
Gast


Hallo!

Ich habe folgendes Problem:
2 cpp-Dateinen und eine hpp möchte ich kompilieren und linken.

erste.cpp
#include "zweite.hpp"

zweite.cpp
#include "zweite.hpp"

zweite.hpp

So sehen die Anhängigkeiten aus. Wenn ich das kompliere, bekomm ich aber undefined references.
Schreibe ich jetzt aber in der ersten.cpp #include "zweite.cpp" (statt "zweite.hpp" ) funktioniert alles.
Warum passiert das?
Eigentlich sollen doch die Header eingebunden werden, oder nicht?
Ich nutzt Dev-Cpp.

Danke
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
17.08.2003, 01:10 Uhr
Pablo
Supertux
(Operator)


Was enthält die Datei zweite.hpp?

mit #include includiert man in der Regel nur .h Dateien. Dort werden Variablen, Klassen, Struturen, Konstanten, und andere Sachen definiert. Wenn man eine Klasse schriebt, schreibt man in den .h Dateien in den meisten Fällen, nur die Implementation, was man auch Prototypen nennt.

In den cpp Datei schriebt man den Code der Funktionen, usw.

Ich weiß nicht wie Dev-Cpp kompiliert, abver ich würde sagen, dass du ales in zweite.cpp deklarierst hast. Deshalb wird richtig kompiliert, wenn du #include "zweite.cpp" in ersten.cpp hast. Wenn aber nur zweite.hpp nicht per include eingefügt eingebunden wird, dann kann es sein, dass der Compiler die Definition, d.h. den Code der Funktionen nicht findet, weil die Definitionen in zweite.cpp enthalten sind.

Wie man solche Probleme mit gcc löst, weiß ich. Mit gcc wäre der Fall:

Code:
$ gcc -c erste.cpp   // objekt erstellen
$ gcc -c zweite.cpp // objekt erstellen
$ gcc erste.o zweite.o // linken



Aber wie es in dev-cpp ist, weiß ich nicht. Kannst du mit einer shell kompilieren? Dann würde ich es so tun.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
17.08.2003, 01:56 Uhr
~unwissender
Gast


Ja, genau, so sollte es gehen, aber das tut es leider nicht!
zweite.hpp enthält die Prototypen für zweite.cpp.

Ich weiß auch nicht weiter, man macht das doch so, das man die cpp-Datei kompiliert, welche per include den Header einfügt.

Danach habe ich die .o-Datei und brauche dann nur alle o-Dateien zu linken, aber leider gibt das undefined refs wenn ich per .hpp einbinde, bei .cpp ist alles in Ordung.

Ürigens ist gcc c und nicht c++, das wäre dann g++ :-).
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
17.08.2003, 02:47 Uhr
Pablo
Supertux
(Operator)


Bennene zweite.hpp in zweite.h um. Es ist nicht notwendig, es ligt nicht daran, aber es ist sieht besser aus, wenn man die Konvention benutzt, d.h. .h

Wann hast du denn die Probleme? Beim Compilieren oder beim Linken?

Wenn der Fehler beim Linken auftritt, und dem Linker alle .o Datein übergibst, dann würde ich sagen, dass die Prototypen von zweite.h keine Prototypen für zweite.cpp sind. Das finde ich komisch! Postet mal deine Dateien.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
17.08.2003, 08:35 Uhr
~unwissender
Gast


Datei1(cpp):


C++:
#include "grund.h"

int main() {
    Grundstueck steuck;
    return 0;
}



Datei 2: (cpp)

C++:
#include <iostream>
#include "grund.h"
using namespace std;

Grundstueck :: Grundstueck() {
    cout << "hi" << endl;
}



Datei 2: (h)

C++:
class Grundstueck {
    public:
        Grundstueck();
};



Ich bestehe darauf, dasss das korrekt ist, erstaunlicherweise kann ich es linken, wenn ich statt Grundstueck steuck; Grundstueck steuck(); verwende.
Wenn ich .cpp einbinde geht beides.
Sehr seltsam...
Edit by virtual: Code Tags korrigiert

Dieser Post wurde am 17.08.2003 um 09:28 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
17.08.2003, 08:36 Uhr
~unwissender
Gast


huch??
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
17.08.2003, 09:34 Uhr
virtual
Sexiest Bit alive
(Operator)



Zitat:
Pablo Yanez Trujillo postete
Bennene zweite.hpp in zweite.h um. Es ist nicht notwendig, es ligt nicht daran, aber es ist sieht besser aus, wenn man die Konvention benutzt, d.h. .h



Das ist dann aber eine sehr private Konvertion. Üblich sind .h, .hh sowie .hpp und auch .H (also großes H).
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
17.08.2003, 09:44 Uhr
virtual
Sexiest Bit alive
(Operator)



Zitat:
~unwissender postete
Ich bestehe darauf, dasss das korrekt ist,[/i]

Sei Dir gegönnt. Ich würde es ähnlich sehen. Allerdings solltest Du im Header nicht die Includeguards vergessen, weil sonst bekommst Du Probleme (nicht jetzt, aber irgendwann)
Grund.h sollte so aussehen:

C++:
#ifdnef GRUND_H_INCLUDED_
#define GRUND_H_INCLUDED_
class Grundstueck {
    public:
        Grundstueck();
};
#endif



Zitat:

erstaunlicherweise kann ich es linken, wenn ich statt Grundstueck steuck; Grundstueck steuck(); verwende.


Das verwundert nicht, weil die Version mit den Klammern kein Constructoraufruf ist sondern eine Deklaration.

Zitat:

Wenn ich .cpp einbinde geht beides.


Das allerdings würde ich nicht machen, weil dies nun wirklich gegen Konventionen spricht und acuh das Aufteilen auf mehrere Sourcedateien ad absurdum führt.

Generell ist an Deinem Code nichts auszusetzen, dh. ein
Code:
g++ datei1.cpp datei2.cpp
sollte zum Erfolg führen,
Viel glück
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 17.08.2003 um 09:45 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
17.08.2003, 13:34 Uhr
0xdeadbeef
Gott
(Operator)



C++:
Grundstueck stueck();


ist eine Funktionsdeklaration. Dass der Linker da nicht spinnt, wundert mich ein bisschen, weil ihm nachher eine Funktionsimplementierung fehlt. Ansonsten sieht es mir danach aus, dass der Compiler nur die eine Datei kompiliert, so dass ihm die Implementierung des Konstruktors Grundstueck::Grundstueck() fehlt. Poste doch mal die Fehlermeldungen im Wortlaut.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
17.08.2003, 13:50 Uhr
Pablo
Supertux
(Operator)


Wenn man nur eine Funktionsdeklaration und keine Funktionsimplementierung hat, ist kein Problem, solange man diese Funktion nicht aufruft, Ich lasse viele Funktionsdeklarationen ohne Implementation, wenn ich nur Testen will, ob eine Funktion nicht funktioniert. Aber der Code lässt sich kompilieren nur dann, wenn ich diese Funktionien nicht explizit aufrufe, sonst kommt Compilerfehler.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: