std::string und andere std::-Typen auf dem Mac ?



  • Könntest du bitte darauf verzichten überlange Fehlerlogs zu posten. In der Regel reichen die ersten 5-10 Zeilen.



  • Wie kann es sein, dass nach einem einsamen #include <string> eine Meldung aus

    /usr/local/Trolltech/Qt-4.4.0/include/QtCore/qstring.h:991: ...
    

    erscheint.
    Kann es sein, dass Du eine Datei 'string' irgendwo rumliegen hast, die da gar nicht hingehört und die dann auch noch Dinge aus QT inkludiert. Also ist die <string>-Datei auch wirklich Teil der mitgelieferten C++-Library?

    Gruß
    Werner



  • Die genannte test.cpp ist Bestandteil des Qt-Projektes. Das -ITrolltech- Zeug kommt automatisch mit.



  • Ich hab jetzt mal verschiedene Tests durchgeführt:

    -test.h und test.cpp wie oben angegeben in ein Verzeichnis. Dann über die Kommandozeile gcc -o test.o test.cpp -> Ergebnis: Kompiliert, ld mault wegen fehlender main, also alles okay.
    -Dann das ganze mit qt:
    im obigen verzeichnis qmake -project, erzeugt ein .pro mit den Headern und sourcen, dann qmake, dann make. -> Ergebnis: Wie oben, kompiliert, wieder meldung über fehlende main. An Qt selbst kann's also nicht liegen.
    -test.h und cpp in mein Arbeitsverzeichnis kopiert, test.cpp und .h im .pro-File meines Projekts eingefügt -> Ergebnis: Es knallt. "copy is not a member of std::" Aus der qstring.h - wo kommt die her? Ich inklude die string.h !!
    -Also meine Projekteinstellungen gelöscht und qmake -project ein neues .pro anlegen lassen. Qmake und make -> Es knallt wieder aus der qstring.h. WTF???

    Es gibt in meinem Qt-include verzeichnis keine string.h, nur eine qstring.h
    Es gibt in meinem Projektverzeichnis keine string.h

    Probiert habe ich es mit Qt 4.3.3, dann hab ich mir Qt4.4.3 aus den Quellen kompiliert und es damit versucht - Verhalten identisch. Neues XCode hab ich installiert - aber bekomme nachwievor nur gcc 4.0.1 ist das normal?

    Ich bin mit meinem Latein echt am ende!



  • Wäre es nicht sinnvoll mit nem C++ Compiler zu kompilieren? gcc ist doch ein C-Compiler. Muss man da nicht g++ benutzen?



  • Sorry, natürlich, ich meine ja g++...
    Das Makefile, was Qt erzeugt, benutzt natürlich auch den g++



  • PhilippM schrieb:

    "copy is not a member of std::" Aus der qstring.h - wo kommt die her? Ich inklude die string.h !!

    1. <string> und nicht <string.h> und
    2. <algorithm> fuer std::copy



  • Vermutlich fehlen "includes" in deinem Source.
    Also z.B. <algorithm> und ggf. noch ein paar andere.



  • Hab den Fehler gefunden.

    Das Problem lag in einer Datei in meinem Projekt namens assert.h in der ich eine eigenes Makro definiert habe, was fehlgeschlagene asserts in einer Datei mitloggt - unter Einsatz von QFile und QTextStream.
    Diese Datei ist natürlich mit
    #ifndef ASSERT_H
    #define ASSERT_H
    #endif

    geguardet. Und scheinbar kollidiert diese assert.h mit einer systeminterenen assert.h - durch den guard werden andere Sachen nicht eingebaut.
    Nachdem ich die Datei in myassert.h umbenannt und den inklude-guard entsprechend angepasst habe, kompiliert es anstandslos.
    Darauf muss man erstmal kommen.



  • Super!

    Sehr schönes Beispiel dafür, dass man seine Includeguards wirklich sehr willkürlich und einmalig wählen sollte. 🙂



  • PhilippM schrieb:

    Darauf muss man erstmal kommen.

    Deshalb verwendet man vernuenftige include guards.
    ASSERT_H bettelt doch um probleme.

    ich verwende zB
    <projektname><pfad><dateiname>_INCLUDED

    manche leute lassen sich die include guards auch automatisch generieren, so dass man zufaellige zeichen im guard stehen hat.

    auche in MYASSERT_H (dazu musst du die datei uebrigens nicht umbenenen) bettelt um probleme...



  • Ich verwende neuerdings (wenn ich nicht pragma once verwenden darf/kann) INCLUDED_PROJECT_FILEPATH_FILENAME_EXT . Das hat den Vorteil dass alle Header-Guards in alphabetisch sortierten Listen zusammen stehen, so dass man "echte" Makros schneller findet, und die sich nicht zwischen den ganzen Header-Guards verlieren.


  • Administrator

    Oder auch noch eine Möglichkeit, vor allem um die ellenlange Pfade abzukürzen:
    H_<projektkürzel>_<dateiname>_GUARD__<datum & zeit alles an einem Stück>

    Bsp:
    H_MLL_PARKING_DLG_GUARD__20090614173821

    Es ist ziemlich unwahrscheinlich, dass jemand in der genau gleichen Sekunde den gleichen Header Guard erstellt 🙂
    Die von hustbear angesprochene Sortierung ist hier übrigens auch vorhanden.

    Grüssli


Anmelden zum Antworten