prob mitt g++ bei kompilieren eines einfachen programms

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
kleinerkiffer
Beiträge: 25
Registriert: 12.08.2006 19:54:00

prob mitt g++ bei kompilieren eines einfachen programms

Beitrag von kleinerkiffer » 11.12.2006 15:08:37

hallo
ich muss fuer numerik c++ programme schreiben. seit kurzen kann ich aber weder alte noch neue programme mehr kompilieren.
ein beispiel: der code des c programms:

Code: Alles auswählen

#include <iostream>
using namespace std;

int main()
{ 
	cout << "hallo welt."<< endl;
   return 0;
}
dieses programm ist das wohl billigst mögliche und es ist ziemlich sicher dass kein fehler im code vorliegt.

trotzdem spuckt mir der Kompiler folgendes aus:

Code: Alles auswählen

user@3002:~/Numerik/test$ g++ hallowelt.cpp
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/cstdlib:135: error: '::system' has not been declared
Dieser fehler taucht jedesmal wenn ich versuche irgendein selbstgeschriebenes programm zu kompilieren auf.

Die fehlermeldung scheint auch darauf hinzuweisen dass der fehler in dieser datei cstdlib steht. Allerdings konnte ich diese nicht finden. Deswegen habe ich dann noch zusätzlich zum vorher verwendeten g++-4.1 den g++-3.4 installiert. Aber es kommt das gleiche Ergebniss:

Code: Alles auswählen

user@3002:~/Numerik/test$ g++-3.4 hallowelt.cpp
In file included from /usr/include/c++/3.4/bits/stl_algobase.h:67,
                 from /usr/include/c++/3.4/bits/char_traits.h:46,
                 from /usr/include/c++/3.4/ios:46,
                 from /usr/include/c++/3.4/ostream:45,
                 from /usr/include/c++/3.4/iostream:45,
                 from hallowelt.cpp:1:
/usr/include/c++/3.4/cstdlib:116: Fehler: »::system« wurde nicht deklariert


nepos
Beiträge: 5238
Registriert: 05.01.2005 10:08:12

Beitrag von nepos » 11.12.2006 15:20:03

Mein g++ schluckt das anstandslos.

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: prob mitt g++ bei kompilieren eines einfachen programms

Beitrag von gms » 11.12.2006 16:55:07

kleinerkiffer hat geschrieben: Die fehlermeldung scheint auch darauf hinzuweisen dass der fehler in dieser datei cstdlib steht. Allerdings konnte ich diese nicht finden. Deswegen habe ich dann noch zusätzlich zum vorher verwendeten g++-4.1 den g++-3.4 installiert. Aber es kommt das gleiche Ergebniss:
Du scheinst ein Problem mit den Standard Headern aus dem Paket libc6-dev zu haben, insbesondere mit "stdlib.h", welches von "cstdlib" inkludiert wird.

Für einen Test habe ich die Deklaration von "system" aus /usr/include/stdlib.h entfernt und konnte so den Fehler reproduzieren:

Code: Alles auswählen

root@csxgen4:/home/gms# g++ -o ./x x.cpp
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/cstdlib:135: error: '::system' has not been declared
In /usr/include/stdlib.h (aus libc6-dev 2.3.6.ds1-8 ) steht bei mir folgendes:

Code: Alles auswählen

__BEGIN_NAMESPACE_STD
/* Execute the given line as a shell command.

   This function is a cancellation point and therefore not marked with
   __THROW.  */
extern int system (__const char *__command);
__END_NAMESPACE_STD
Gruß
gms
Zuletzt geändert von gms am 13.05.2007 00:02:40, insgesamt 1-mal geändert.

kleinerkiffer
Beiträge: 25
Registriert: 12.08.2006 19:54:00

Beitrag von kleinerkiffer » 11.12.2006 17:23:56

ibc6-dev ist bei mir auch version 2.3.6.ds1-8

in /usr/include/stdlib.h steht bei mir exakt das gleiche wie bei Dir.

hast du vielleicht einen tipp wo der fehler sonst stecken könnte?

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 11.12.2006 18:27:15

wie schaut bei dir folgende Ausgabe aus:

Code: Alles auswählen

gms@gms1:~$ g++ -E x.cpp | grep "#.*stdlib"
# 1 "/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/cstdlib" 1 3
...
# 71 "/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/cstdlib" 3
# 1 "/usr/include/stdlib.h" 1 3 4
...
# 902 "/usr/include/stdlib.h" 3 4
# 72 "/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/cstdlib" 2 3
...
# 192 "/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/cstdlib" 3
Gruß
gms

kleinerkiffer
Beiträge: 25
Registriert: 12.08.2006 19:54:00

Beitrag von kleinerkiffer » 12.12.2006 13:23:02

Code: Alles auswählen

user@3002:/mnt/open/Numerik/test$ g++ -E hallowelt.cpp | grep "#.*stdlib"
# 1 "/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/cstdlib" 1 3
# 48 "/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/cstdlib" 3
# 49 "/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/cstdlib" 3
# 71 "/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/cstdlib" 3
# 1 "/usr/include/stdlib.h" 1 3 4
# 33 "/usr/include/stdlib.h" 3 4
# 34 "/usr/include/stdlib.h" 2 3 4
# 43 "/usr/include/stdlib.h" 2 3 4
# 44 "/usr/include/stdlib.h" 2 3 4
# 96 "/usr/include/stdlib.h" 3 4
# 140 "/usr/include/stdlib.h" 3 4
# 239 "/usr/include/stdlib.h" 3 4
# 424 "/usr/include/stdlib.h" 3 4
# 440 "/usr/include/stdlib.h" 3 4
# 607 "/usr/include/stdlib.h" 2 3 4
# 691 "/usr/include/stdlib.h" 3 4
# 702 "/usr/include/stdlib.h" 3 4
# 711 "/usr/include/stdlib.h" 3 4
# 721 "/usr/include/stdlib.h" 3 4
# 749 "/usr/include/stdlib.h" 3 4
# 814 "/usr/include/stdlib.h" 3 4
# 902 "/usr/include/stdlib.h" 3 4
# 72 "/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/cstdlib" 2 3
# 103 "/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/cstdlib" 3
# 159 "/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/cstdlib" 3
# 192 "/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/cstdlib" 3

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 12.12.2006 16:41:08

bei dieser Ausgabe gibt es nur minimale Änderungen, die entscheidenden Zeilen ( zwischen stdlib.h(721) und stdlib.h(749) wird "system" deklariert ) sind aber gleich

hier solltest du dann eigentlich auch die gleiche Ausgabe erhalten:

Code: Alles auswählen

gms@gms4:~$ g++ -E hallowelt.cpp  | grep system
extern int system (__const char *__command);
  using ::system;
(die erste Zeile ist die Deklaration aus "stdlib.h", die zweite Zeile ist die Referenz aus "cstdlib" )

Die einzige Erklärung die mir einfällt, die das bei dir beobachtete Verhalten erklären würde, wäre ein "zusätzliches Define", z.B. so:

Code: Alles auswählen

gms@gms4:~$ g++ -o x x.cpp -Dsystem=mysystemdef
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/cstdlib:135: error: '::system' has not been declared
Dieses "Define" könnte natürlich auch in einer Header-Datei verborgen sein, müßte aber in der Ausgabe von "g++ -E hallowelt.cpp | grep system" ersichtlich sein

Gruß
gms

Antworten