c++ header in linux

E

Echid

Jungspund
hallo leute,
ich habe ein problem und zwar weiß ich nicht wie ich eine header datei unter linux in ein programm einbinde, als ich bei google gesucht habe stand man sollte einfach /usr/local/lib oder /usr/include einbinden oder /usr/include/g++(dieses verzeichnis existiert bei mir nicht), die ausgabe beim compilieren sieht folgender maßen aus:

[x42x@noname C]$ gcc -o schueler ./schueler.c
./schueler.c:3: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘Schueler’
./schueler.c:28: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘:’ token
./schueler.c:40: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘:’ token
./schueler.c:53: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘:’ token
./schueler.c:68: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘:’ token
./schueler.c:74: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘:’ token
./schueler.c:81: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘Schueler’
./schueler.c:96: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘:’ token


wenn ich das programm auszuführen versuche trotz der fehler sagt er er kennt das kommando class nicht:


./schueler.c: line 2: class: command not found
./schueler.c: line 10: syntax error near unexpected token `char'
./schueler.c: line 10: `Schueler (char *name);'

ich schreibe morgen schulaufgabe in c++ wäre nett wenn ihr mir schnell helfen könntet
 
Hast Du in einer Datei schueler.c eine Klasse definiert und dann versucht, diese mit gcc zu kompilieren?

  • Benenne schueler.c in schueler.cpp um.
  • gcc ist der C-Compiler. Verwende g++ Wenn Dein System das Kommando g++ nicht kennt, dann musst den C++-Comiler installieren.
  • class ist kein Kommando, sondern der Typenname für eine Klasse. Klassen gibt es nur in C++.
Die Verzeichnisse, die Du angegeben hast, sind Standardverzeichnisse des Compilers, die findet er ohne weitere Angaben.
 
Zuletzt bearbeitet:
aso ok danke,
hat man g++ nicht standardmäßig bei linux mit installiert, denn ich finde es nicht auf meinem system und kann ich es normal über apt-get install g++ herunterladen weil er mein das packet kann nicht gefunden werden
 
das hängt von der distribution und den eingben die du währen der installation gemacht hast ab
betreffen apt mit apt cache search kannst du suchen gib uns mal die ausgabe der folgenden zwei befehle
Code:
apt-cache search gnu c++ compiler
cat /etc/apt/sources.list
 
Zuletzt bearbeitet:
danke für eure hilfe,
also ich habs jetzt einfach über synaptic installiert aber mein programm enthält trotzdem noch fehler, das selbe programm läuft bei meinem freund auf windows ganz normal oder muss ich jetzt doch noch etwas einbinden mein programm sieht folgendermaßen aus:


class Schueler
{
//Attribute
private:
char *name;

public:
//Konstruktor
Schueler (char *name);
//Copy-Konstruktor
Schueler (Schueler &x);//<--Referenz
//Zuweisungen mit =
Schueler operator=(Schueler &x);
//Destruktor
~Schueler();
//Vergleich mit ==
bool operator==(Schueler &x);
//Getter
char *getName();
//Setter
void setName(char *name);
void grossbuchstaben();
};

//Konstruktor
Schueler::Schueler(char *name)
{
int laenge=strlen(name)+1;
this->name = new char[laenge];

for (int i = 0; i < laenge; i++)
{
this->name = name;
}
}

//Copy-Konstruktor
Schueler::Schueler (Schueler &x)
{
char *anderer_name = x.getName();
int laenge = strlen(x.getName())+1;
this->name = new char[laenge];

for (int i = 0; i < laenge; i++)
{
this->name = anderer_name;
}
}

//Zuweisung mit =
Schueler::Schueler operator=(Schueler &x)
{
char *anderer_name = x.getName();
delete this->name;
int laenge = strlen(x.getName())+1;
this->name = new char[laenge];

for (int i = 0; i <laenge; i++)
{
this->name = anderer_name;
}
return *this;
}

//Destruktor
Schueler::~Schueler()
{
delete this->name;
}

//Getter
char *Schueler::getName()
{
return this->name;
}

//Vergleich mit ==

bool Schueler::operator==(Schueler &x)
{
char *anderer_name = x.getName();
bool stimmt = true;
while(stimmt = true)
{
int i = 0;
if(this->name != anderer_name)
{
return false;
}
i++;
}
}

void Schueler::setName(char *name)
{
int laenge = strlen(name);
delete this->name;
this->name= new char[laenge+1];
for (int i = 0; i < laenge+1; i++)
{
this->name = name;
}
}

//Call by Value
void cbVFunktion(Schueler x)
{
x.setName("Anton");
cout << "CbV:" << x.getName() << endl;
}

int main()
{
// Schueler peter mit namen peter anlegen
Schueler peter("peter");
// Schueler karl mit namen karl anlegen
Schueler karl("karl");

//Funktionsaufrufe
cout << "--------Schueler peter--------" << endl;
cout << peter.getName() << endl;
peter.setName("heinz");
cout << peter.getName() << endl;
hans.grossbuchstaben();
cout << peter.getName() << endl;
cout << "--------Schueler karl--------" << endl;
cout << karl.getName() << endl;
karl = peter;
cout << karl.getName() << endl;
if (karl == peter)
cout << "karl ist peter" << endl;
else
cout << "karl ist kein peter" << endl;
return 0;
}

und die fehlermeldungen beim compilieren versteh ich nicht:

[root@noname C]# g++ -o schueler2 ./schueler2.cpp
./schueler2.cpp: In constructor ‘Schueler::Schueler(char*)’:
./schueler2.cpp:26: error: ‘strlen’ was not declared in this scope
./schueler2.cpp: In copy constructor ‘Schueler::Schueler(Schueler&)’:
./schueler2.cpp:36: error: ‘strlen’ was not declared in this scope
./schueler2.cpp: In member function ‘Schueler Schueler::operator=(Schueler&)’:
./schueler2.cpp:48: error: ‘strlen’ was not declared in this scope
./schueler2.cpp: In member function ‘bool Schueler::operator==(Schueler&)’:
./schueler2.cpp:58: error: ‘strlen’ was not declared in this scope
./schueler2.cpp: In member function ‘void Schueler::setSpitzname(char*)’:
./schueler2.cpp:76: error: ‘strlen’ was not declared in this scope
./schueler2.cpp: In member function ‘void Schueler::Grossbuchstaben()’:
./schueler2.cpp:83: error: ‘strlen’ was not declared in this scope
./schueler2.cpp:84: error: ‘toupper’ was not declared in this scope
./schueler2.cpp: In function ‘void CallByValueFunktion(Schueler)’:
./schueler2.cpp:90: error: ‘cout’ was not declared in this scope
./schueler2.cpp:90: error: ‘endl’ was not declared in this scope
./schueler2.cpp: In function ‘int main()’:
./schueler2.cpp:95: error: ‘cout’ was not declared in this scope
./schueler2.cpp:95: error: ‘endl’ was not declared in this scope
./schueler2.cpp:107: error: ‘system’ was not declared in this scope

was heißt denn da, z.B. das strlen nicht deklariert sei, das ist doch eine normale funktion oder ist der aufruf falsch

sorry für den langen post :D
 
Die Standardlibrary von Windows bringt ein paar Funktionen so mit. Füge
Code:
#include <string.h>
ganz oben ein. Darunter
Code:
using namespace std;
Habe leider kein Linux hier und kann das nicht prüfen. Aber da scheinen leider noch mehr Fehler drin zu sein, die MS nicht krumm nimmt...
 
Zuletzt bearbeitet:
Aus der Manpage zu strlen (man strlen).

Code:
SYNOPSIS
       #include <string.h>

       size_t strlen(const char *s);
 
ok danke jetzt funktioniert es, hab noch ein paar leichtsinnsfehler gehabt,
wenn ich das programm ausführe bleibt er im programm und ich komm nicht zur befehlseingabe zurück, muss ich das sowas wie ein system("hold") einfügen?
 
binde den Quellcode in
Code:
(CODE)(/CODE) - runde durch eckige klammern ersetzten
klamern ein, das erhöht die lesbarkeit
 
wenn ich das programm ausführe bleibt er im programm und ich komm nicht zur befehlseingabe zurück, muss ich das sowas wie ein system("hold") einfügen?

Nein, dein Programm enthält eine Endlosschleife und außerdem einige Speicherlecks. Ich glaube du brauchst noch etwas Nachhilfe in C++ :) . Wie lange nehmt ihr das denn schon durch und in welchem Fach?

1. Wenn du mit new ein Array anlegst, z.B. so:
Code:
this->name = new char[laenge];
dann must du es auch mit der Array-Form von delete wieder freigeben:
Code:
delete[] this->name;

2. Die operator==-Funktion solltest du noch überarbeiten. Zunächst setzt du die Variable "stimmt" in der while-Schleife nirgends auf false, sodass die Schleife endlos läuft. Die Bedingung in der while-Schleife sollte mit einem Vergleichsoperator (==) und nicht mit einem Zuweisungsoperator erfolgen:
Code:
while(stimmt =[COLOR="Red"]=[/COLOR] true)
Die Variable "i" mußt du außerhalb der Schleife definieren, sonst bleibt der Wert immer auf 0. Weiterhin mußt du überprüfen das die Arrays "this->name" und "anderer_name" genug Elemente enthalten, weil du ansonsten ein Segmentation fault bekommst wenn du auf einen Index über der Größe des Arrays zugreifst. Mein Vorschlag für die Implementierung der operator==-Methode in Pseudocode:
Code:
Funktion Vergleich(Zeichenkette1, Zeichenkette2):
    Wenn Länge von Zeichenkette1 != Länge von Zeichenkette2:
        Return False

    Index = 0
    Solange Index < Länge von Zeichenkette1:
        Wenn Zeichenkette1[Index] != Zeichenkette2[Index]:
            Return False
        Index++
    Ende Solange
    Return True
Ende Funktion

Sollt ihr die Vergleichs-Methode selbst programmieren oder könnt ihr euch der bei C++ mitgelieferten Funktionen bedienen? Dann verwende in der operator==-Methode lieber die strncmp-Funktion anstatt die Funktionalität selbst zu programmieren. Oder noch besser: wenn ihr schon in C++ programmiert, verwende die String-Klasse aus der Standard-Bibliothek und nicht char-Arrays. Außer ihr seit noch nicht soweit und verwendet deswegen char-Arrays um den Umgang damit zu lernen.

Hinweis: Wenn du C++ programmierst solltest du nicht die C-Header einbinden falls du C-Funktionen brauchst, sondern die entsprechenden C++-Header. Anstatt also
Code:
#include <string.h>
zu verwenden, nimmst du
Code:
#include <cstring>
(siehe http://www.cppreference.com/wiki/c/start).

Gruß,
Philip
 
Zuletzt bearbeitet:

Ähnliche Themen

Ausführbare C-Datei von Mac OS auf Embedded Linux ausführen

OpenCV Installieren

dovecot und postfix Konfiguration Problem

Rollei Mini Wifi Camcorder

g++ kompilieren schlägt fehl

Zurück
Oben