Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (GNU/Linux, *NIX, *BSD und Co) » gcc-Anfängerfrage

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
14.12.2006, 23:36 Uhr
Yadgar



High!

Wahrscheinlich klingt meine Frage strunzblöd, und wahrscheinlich wird es mir auch wie Schuppen von den Augen fallen, wenn ich von euch die Lösung erfahre... aber im Moment stehe ich wirklich da wie der sprichwörtliche Ochs vorm Berg.

Ich habe zum Testen der Modularisierung meines YIP-Programms mal ein kleines Beispielprogramm mit einer in classtest.h deklarierten Klasse geschrieben, die in classtest.cpp mit sämtlichen Methoden definiert ist und in ctmain.cpp angewendet wird.

Wenn ich aber jetzt den Compiler mit

g++ classtest.h classtest.cpp ctmain.cpp -o ct

starte, bekomme ich nur eine Meldung "Compilation of header file requested", der Code wird nicht kompiliert.

Lasse ich classtest.h in der Kommandozeile weg, haut mir der Compiler eine ganze Latte von Fehlermeldungen um die Ohren... dabei glaube ich mich zu erinnern, dass ich im Rahmen von Programmierübungen aus einem Lehrbuch (Breymann) voriges Jahr durchaus erfolgreich solche mehrteiligen Programme kompiliert habe... was mache ich falsch?

Bis bald im Khyberspace!

Yadgar
--
Flagmaker - ein Programmier-Blog
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
14.12.2006, 23:43 Uhr
Blubber2063



Ganz einfach normalerweise compiliert man keine Headerfiles, denn die sind ja schließlich schon in den cpp files includet. Du solltest dir das Konzept der Modularisierung unter C/C++ noch mal genau anschauen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
15.12.2006, 00:46 Uhr
J-jayz-Z
Perl Crack ala Carte
(Operator)


Evtl. schaust du einfach mal hier und postest dann hier gleich noch den Code, falls er dehalb nicht kompiliert
--
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="66756e2d736f66742e6465"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
15.12.2006, 11:19 Uhr
ao

(Operator)



Zitat von Blubber2063:
... denn die sind ja schließlich schon in den cpp files includet.

Wahrscheinlich sind sie genau das nicht, daher die Latte von Fehlermeldungen.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
15.12.2006, 14:21 Uhr
Pablo
Supertux
(Operator)



Zitat von ao:

Wahrscheinlich sind sie genau das nicht, daher die Latte von Fehlermeldungen.

ao


oder du hast sowas wie


C++:
// test.cpp
#include <meineheader.h>

...



dann sucht g++ meinheader in /usr/include, dann solltest du entweder

#include "meineheader.h"

benutzen oder

g++ test.cpp -I.

ausführen
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 15.12.2006 um 14:22 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
15.12.2006, 14:45 Uhr
ao

(Operator)



Zitat von Pablo:
... dann sucht g++ meinheader in /usr/include ...

Kann auch sein. Allerdings sollte dann die erste Fehlermeldung lauten "meinheader.h: no such file" oder so ähnlich, was den aufmerksamen (!) Programmierer schon mal auf die richtige Spur setzen könnte.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
15.12.2006, 14:58 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


er soll einfach mal die fehlermeldung posten, dann wissen wir worans liegt.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
15.12.2006, 23:43 Uhr
Yadgar




Zitat von J-jayz-Z:
Evtl. schaust du einfach mal hier und postest dann hier gleich noch den Code, falls er dehalb nicht kompiliert


Also, hier der Header (classtest.h):


C++:
#ifndef CLASSTEST_H
#define CLASSTEST_H

class TestClass
{
  private:
    short a;
    short b;
  public:
     TestClass(short ia, short ib); // Konstruktor
     ~TestClass();                  // Destruktor
     void displayValues();
     void alterValues(short ia, short ib);
};

#endif



Die Klassendefinition (classtest.cpp):


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

TestClass::TestClass(short ia, short ib)  // Konstruktor
: a(ia), b(ib)
{
  cout << "TestClass-Objekt erzeugt!";
}

TestClass::~TestClass() // Destruktor
{
  cout << "TestClass-Objekt zerstört!";
}

void TestClass::displayValues()
{
  cout << "(" << a << "/" << b << ")" << endl;
}

void TestClass::alterValues(short ia, short ib)
{
  a = ia;
  b = ib;
}



...schließlich das Hauptprogramm (ctmain.cpp):


C++:
#include<iostream>
using namespace std;
#include "classtest.cpp"

int main()
{
  TestClass tc(4, 6);
  tc.displayValues();
  tc.alterValues(11, 5);
  tc.displayValues();

  return 0;
}



Das hier wiederum ist der Fehlermeldungs-Salat, den ich bei
g++ classtest.cpp ctmain.cpp -o ct/exe
bekomme:


Code:
/tmp/ccwsioQ7.o(.text+0x0): In function `TestClass::TestClass[not-in-charge](short, short)':
: multiple definition of `TestClass::TestClass[not-in-charge](short, short)'
/tmp/cc4dHTZm.o(.text+0x0): first defined here
/tmp/ccwsioQ7.o(.text+0x3c): In function `TestClass::TestClass[in-charge](short, short)':
: multiple definition of `TestClass::TestClass[in-charge](short, short)'
/tmp/cc4dHTZm.o(.text+0x3c): first defined here
/tmp/ccwsioQ7.o(.text+0x78): In function `TestClass::~TestClass [not-in-charge]()':
: multiple definition of `TestClass::~TestClass [not-in-charge]()'
/tmp/cc4dHTZm.o(.text+0x78): first defined here
/tmp/ccwsioQ7.o(.text+0x96): In function `TestClass::~TestClass [in-charge]()':
: multiple definition of `TestClass::~TestClass [in-charge]()'
/tmp/cc4dHTZm.o(.text+0x96): first defined here
/tmp/ccwsioQ7.o(.text+0xb4): In function `TestClass::displayValues()':
: multiple definition of `TestClass::displayValues()'
/tmp/cc4dHTZm.o(.text+0xb4): first defined here
/tmp/ccwsioQ7.o(.text+0x118): In function `TestClass::alterValues(short, short)':
: multiple definition of `TestClass::alterValues(short, short)'
/tmp/cc4dHTZm.o(.text+0x118): first defined here
collect2: ld returned 1 exit status



Was bedeutet hier "in-charge" bzw. "not-in-charge"?

Bis bald im Khyberspace!

Yadgar

Now playing: Oye mi canto (Gloria Estefan)
--
Flagmaker - ein Programmier-Blog

Dieser Post wurde am 16.12.2006 um 01:58 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
16.12.2006, 02:01 Uhr
Pablo
Supertux
(Operator)


In ctmain.cpp hast du ein


C++:
#include "classtest.cpp"



anstatt


C++:
#include "classtest.h"



Da stehen Sachen wie "multiple definition of" oder "first defined here", das würde bedeuten, dass du die Klasse 2 Mal kompilierst oder so.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 16.12.2006 um 02:02 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
16.12.2006, 12:12 Uhr
ao

(Operator)



Zitat von Pablo:
... das würde bedeuten, dass du die Klasse 2 Mal kompilierst oder so.

Das tut er.
1. Mal über die Kommandozeile (g++ classtest.cpp)
2. Mal inkludiert in ctmain.cpp

Also, #include "classtest.h" und alles wird besser.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (GNU/Linux, *NIX, *BSD und Co) ]  


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: