Fehler in cstring!?



  • Hallo Leute!

    Ich habe ein ziemlich komisches Problem mit einem aktuellem Projekt von mir.
    Ich nutze KDevelop um eine SDL/OpenGL-Anwendung zu schreiben. Den Code konnte ich so auf Windows mit MS Visual Studio 7 problemlos kompilieren. Aber jetzt mit Fedora Core 5 und KDevelop wills nicht klappen. Und das ironische daran ist, dass der Compiler sich (scheinbar) nicht über meinen Code sondern über den Code der standard C++-Libary beschwert! Irgendwas haut da nich hin.

    Hier mal die Ausgabe von KDevelop bzw. vom Compiler:

    cd '/home/mathias/workspace/cpp/kquadromaestro/debug' && WANT_AUTOCONF_2_5="1" WANT_AUTOMAKE_1_6="1" gmake -j1
    gmake all-recursive
    Making all in src
    if g++ -DHAVE_CONFIG_H -I. -I/home/mathias/workspace/cpp/kquadromaestro/src -I.. -I/usr/include/SDL -D_REENTRANT -O0 -g3 -MT kquadromaestro.o -MD -MP -MF ".deps/kquadromaestro.Tpo" -c -o kquadromaestro.o /home/mathias/workspace/cpp/kquadromaestro/src/kquadromaestro.cpp; then mv -f ".deps/kquadromaestro.Tpo" ".deps/kquadromaestro.Po"; else rm -f ".deps/kquadromaestro.Tpo"; exit 1; fi
    /usr/lib/gcc/i386-redhat-linux/4.1.0/../../../../include/c++/4.1.0/cstring:80: Fehler: »::memcpy« wurde nicht deklariert
    /usr/lib/gcc/i386-redhat-linux/4.1.0/../../../../include/c++/4.1.0/cstring:81: Fehler: »::memmove« wurde nicht deklariert
    /usr/lib/gcc/i386-redhat-linux/4.1.0/../../../../include/c++/4.1.0/cstring:82: Fehler: »::strcpy« wurde nicht deklariert
    /usr/lib/gcc/i386-redhat-linux/4.1.0/../../../../include/c++/4.1.0/cstring:83: Fehler: »::strncpy« wurde nicht deklariert
    /usr/lib/gcc/i386-redhat-linux/4.1.0/../../../../include/c++/4.1.0/cstring:84: Fehler: »::strcat« wurde nicht deklariert
    /usr/lib/gcc/i386-redhat-linux/4.1.0/../../../../include/c++/4.1.0/cstring:85: Fehler: »::strncat« wurde nicht deklariert
    /usr/lib/gcc/i386-redhat-linux/4.1.0/../../../../include/c++/4.1.0/cstring:86: Fehler: »::memcmp« wurde nicht deklariert
    /usr/lib/gcc/i386-redhat-linux/4.1.0/../../../../include/c++/4.1.0/cstring:87: Fehler: »::strcmp« wurde nicht deklariert
    /usr/lib/gcc/i386-redhat-linux/4.1.0/../../../../include/c++/4.1.0/cstring:88: Fehler: »::strcoll« wurde nicht deklariert
    /usr/lib/gcc/i386-redhat-linux/4.1.0/../../../../include/c++/4.1.0/cstring:89: Fehler: »::strncmp« wurde nicht deklariert
    /usr/lib/gcc/i386-redhat-linux/4.1.0/../../../../include/c++/4.1.0/cstring:90: Fehler: »::strxfrm« wurde nicht deklariert
    /usr/lib/gcc/i386-redhat-linux/4.1.0/../../../../include/c++/4.1.0/cstring:91: Fehler: »::strcspn« wurde nicht deklariert
    /usr/lib/gcc/i386-redhat-linux/4.1.0/../../../../include/c++/4.1.0/cstring:92: Fehler: »::strspn« wurde nicht deklariert
    /usr/lib/gcc/i386-redhat-linux/4.1.0/../../../../include/c++/4.1.0/cstring:93: Fehler: »::strtok« wurde nicht deklariert
    /usr/lib/gcc/i386-redhat-linux/4.1.0/../../../../include/c++/4.1.0/cstring:94: Fehler: »::memset« wurde nicht deklariert
    /usr/lib/gcc/i386-redhat-linux/4.1.0/../../../../include/c++/4.1.0/cstring:95: Fehler: »::strerror« wurde nicht deklariert
    /usr/lib/gcc/i386-redhat-linux/4.1.0/../../../../include/c++/4.1.0/cstring:96: Fehler: »::strlen« wurde nicht deklariert
    /usr/lib/gcc/i386-redhat-linux/4.1.0/../../../../include/c++/4.1.0/cstring:98: Fehler: »::memchr« wurde nicht deklariert
    /usr/lib/gcc/i386-redhat-linux/4.1.0/../../../../include/c++/4.1.0/cstring: In function »void* std::memchr(void*, int, size_t)«:
    /usr/lib/gcc/i386-redhat-linux/4.1.0/../../../../include/c++/4.1.0/cstring:102: Fehler: ungültige Umwandlung von »const void*« in »void*«
    /usr/lib/gcc/i386-redhat-linux/4.1.0/../../../../include/c++/4.1.0/cstring:102: Fehler: Argument 1 von »void* std::memchr(void*, int, size_t)« wird initialisiert
    /usr/lib/gcc/i386-redhat-linux/4.1.0/../../../../include/c++/4.1.0/cstring: At global scope:
    /usr/lib/gcc/i386-redhat-linux/4.1.0/../../../../include/c++/4.1.0/cstring:104: Fehler: »::strchr« wurde nicht deklariert
    /usr/lib/gcc/i386-redhat-linux/4.1.0/../../../../include/c++/4.1.0/cstring:110: Fehler: »::strpbrk« wurde nicht deklariert
    /usr/lib/gcc/i386-redhat-linux/4.1.0/../../../../include/c++/4.1.0/cstring:116: Fehler: »::strrchr« wurde nicht deklariert
    ...

    Das geht so noch endlos weiter mit istream.

    Ich weiß echt nicht wie das zustande kommt! Hat jemand von euch schonmal ähnliche Erfahrungen gemacht? Ich bin für jede Hilfe dankbar.

    Was meinen Code angeht, wie gesagt ließ der sich auf Windows problemlos kompilieren, und ich habe auch nichts außergewöhnliches mit string oder fstream gemacht, halt ganz normal eingebunden. ( #include <string>, #include <fstream> )
    In anderen Projekten funktionierts auch. Es muss irgendeine Besonderheit im Code geben, diese kann ich allerdings nicht finden.
    Leider ist der Code zu lang um ihn hier zu posten.



  • hast vll. using namespace std; vergessen?



  • Schnelldiagnose: Du hast da irgendwas vergessen, genauer wird's erst, wenn meine Kristallkugel aus der Werkstatt zurück ist oder Du auch ein Minimalbeispiel postest.



  • Irgendjemand hat string.h und nicht cstring included. Mach mal ein #include <cstring> bevor du irgendwas anderes includest.



  • Ok, ich hab versuch als aller erstes <cstring> zu inkludieren, das hat aber nichts gebracht. 😞

    Naja, ich poste jetzt die wichtigen Stellen aus allen involvierten Dateien, also nur die Teile der Header wo inkludiert wird:

    Hauptdatei:

    #ifdef HAVE_CONFIG_H
    #include <config.h>
    #endif
    
    #include <iostream>
    #include <cstring>
    #include <vector>
    #include "playground.h"
    #include "event.h"
    #include "window.h"
    using namespace playground;
    
    ...
    

    playground.h

    #ifndef PLAYGROUND
    #define PLAYGROUND
    
    #include <iostream>
    #include <fstream>
    #include <string>
    #include <SDL/SDL.h>
    #include <GL/gl.h>
    #include "log.h"
    
    using namespace std;
    
    #define DO_ONCE(action) { static bool x = false; if(x = !x) { action } }
    
    namespace playground {
    
      // Globale Variablen für playground
      extern std::string    name; //!< Name der Applikation / des Spiels (Fenstertitel)
      extern logstream log;  //!< Globaler Log-Stream
    
      // Globale Funktionen für playground
      bool  init(string name); //!< Initialisierung der Engine
      void  shutdown(); //!< "Runterfahren" der Engine
    
    } // playground
    
    #endif
    

    geometry.h

    #ifndef PLAYGROUND_GEOMETRY
    #define PLAYGROUND_GEOMETRY
    
    #include <cstdlib>
    #include <iostream>
    #include <string>
    using namespace std;
    
    namespace playground {
    ...
    

    log.h

    #ifndef PLAYGROUND_LOG
    #define PLAYGROUND_LOG
    
    #include <iostream>
    #include <fstream>
    #include <string>
    #include "geometry.h"
    using namespace std;
    
    namespace playground {
    
      class logstream : public std::ofstream
      {
        public:
          logstream& operator << (Vertex  v);
      };  
    
    } // playground
    
    #endif
    

    object.h

    #ifndef PLAYGROUND_OBJECT
    #define PLAYGROUND_OBJECT
    
    #include <cstdlib>
    #include <string>
    #include <SDL/SDL.h>
    #include "geometry.h"
    using namespace std;
    
    namespace playground {
    ...
    

    string.h (eine benutzerdefinierte String-Klasse)

    #ifndef PLAYGROUND_STRING
    #define PLAYGROUND_STRING
    
    #include <iostream>
    using namespace std;
    
    namespace playground {
    
    class String {
    ...
    

    texture.h

    #ifndef PLAYGROUND_TEXTURE
    #define PLAYGROUND_TEXTURE
    
    #include <cstdlib>
    #include <iostream>
    #include <string>
    #include <SDL/SDL.h>
    #include <GL/gl.h>
    #include <GL/glu.h>
    #include <GL/glext.h>
    #include <vector>
    #include "playground.h"
    using namespace std;
    
    namespace playground {
    ...
    

    window.h

    #ifndef PLAYGROUND_WINDOW
    #define PLAYGROUND_WINDOW
    
    #include <cstdlib>
    #include <SDL/SDL.h>
    #include <GL/glu.h>
    #include "playground.h"
    using namespace std;
    
    namespace playground {
    
      class Window 
      {
    ...
    

    So, das müsste alles sein, was von Bedeutung ist.



  • Ich würde sagen es liegt an deiner Fragwürdigen benutzung von namespaces!



  • Ist es nicht eigentlich unüblich sich seine eigenen Namensbereiche zu basteln? Jedenfalls wusste ich vorher noch nicht einmal, dass dass geht!

    Mfg Ominion



  • Ominion schrieb:

    Ist es nicht eigentlich unüblich sich seine eigenen Namensbereiche zu basteln? Jedenfalls wusste ich vorher noch nicht einmal, dass dass geht!

    Nein, das sollte man eher so machen. Dafür sind namespaces ja schließlich gedacht 🙄



  • *hmpf*

    Hm, nman, kannst du mir sagen wann deine Kristallkugel ungefähr wieder aus der Werkstatt zurückkommt? 😉

    Naja, ich weiß ehrlich gesagt nicht, was an meiner Verwendung von Namespaces "fragwürdig" ist. Könntest du mich bitte aufklären, Storm.Xapek.de?

    Und kingruedis Aussage unterschreibe ich so!!

    Wie auch immer, das Problem ist immer noch nicht gelöst. Ich werde wohl noch eine Weile damit zu tun haben. :-\



  • Es ist sehr fragwürdig Namespaces in Header Dateien zu öffnen (also using namespace).

    Ansonsten mach ein minimales Beispiel und poste das. Offensichtlich versuchst du auf Dinge im globalen Namespace zuzugreifen, die dort nicht sind 🙂



  • Ok vielleicht habe ich schon zu lange kein C++ mehr programmiert... 😕

    Ich versuche gerade krampfhaft den Fehler zu reproduzieren, habs aber bisher noch nicht hinbekommen. Ich habe den kompletten Source mal hochgeladen:
    source.tar.gz

    Erstmal soweit danke. Es muss ja irgendwie was mit den Namespaces zu tun haben.
    Werde weiter versuchen.



  • Bei mir kompiliert ein

    g++ *.cpp -c
    

    sowohl mit GCC 4.1 als auch GCC 3.3.5.



  • 😮

    Ich hab das auch mal einfach per Konsole erstellt:

    g++ *.cpp -c
    g++ -lGL -lSDL -lGLU *.o -o qm
    

    Keine Fehler und nix. Lässt sich starten, alles funktioniert. Hä?
    Also liegt es wohl an KDevelop!

    Danke für den Denkanstoß Ponto, hab vorher nie auch nur daran gedacht, dass es an der IDE liegen könnte. Ich muss nur noch rausfinden was genau KDevelop macht, damit das zustande kommt.



  • MAG schrieb:

    😮

    Ich hab das auch mal einfach per Konsole erstellt:

    g++ *.cpp -c
    g++ -lGL -lSDL -lGLU *.o -o qm
    

    Keine Fehler und nix. Lässt sich starten, alles funktioniert. Hä?
    Also liegt es wohl an KDevelop!

    Danke für den Denkanstoß Ponto, hab vorher nie auch nur daran gedacht, dass es an der IDE liegen könnte. Ich muss nur noch rausfinden was genau KDevelop macht, damit das zustande kommt.

    KDevelop ruft auch nur make auf. Du kannst mal ein make clean und dann ein make im Verzeichnis machen. Dann siehst du die ausgeführten Befehle und eventuell den Fehler.


Anmelden zum Antworten