QT Beispiel, Error



  • Also ich hab diese Fehler auch bekommen und die waren nach dem ich den Moc drüber gejagt hab weg ( und die datei mit eingebunden hab die er ausgespuckt hat )

    MfG



  • was und wo ist Moc?

    MFG



  • rolfi schrieb:

    was und wo ist Moc?

    MFG

    Arbeite bitte mal das Tutorial durch. Dann wirst du viel mehr wissen.



  • http://www.cg.fb12.uni-siegen.de/Lehre/GraPra/Material/intro-qt.pdf
    wie sag ich nun dem dec-cpp das er den Metaobjekt-Compiler nehmen soll?

    MFG



  • hab das händisch gemacht:

    moc mainwindow.h -o mainwindow.moc
    

    was mach ich mit dem moc file? geht das noch einfacher, außer das man es händisch macht...?

    ergebnis:

    /****************************************************************************
    ** Meta object code from reading C++ file 'mainwindow.h'
    **
    ** Created: Sa 2. Jul 21:15:08 2005
    **      by: The Qt Meta Object Compiler version 58 (Qt 4.0.0)
    **
    ** WARNING! All changes made in this file will be lost!
    *****************************************************************************/
    
    #include "mainwindow.h"
    #if !defined(Q_MOC_OUTPUT_REVISION)
    #error "The header file 'mainwindow.h' doesn't include <QObject>."
    #elif Q_MOC_OUTPUT_REVISION != 58
    #error "This file was generated using the moc from 4.0.0. It"
    #error "cannot be used with the include files from this version of Qt."
    #error "(The moc has changed too much.)"
    #endif
    
    static const uint qt_meta_data_MainWindow[] = {
    ......
    ......
    

    MFG



  • hi leute!
    es geht nun mit diesem moc;-)
    einfach

    #include "mainwindow.moc"
    

    aber muss man den moc nicht auch über die .cpp datei drüber laufen lassen? wie man automatisch mocen?

    infos habe ich da gefunden:
    Anmerkung: Der MetaObjektCompiler (moc) implementiert das Signal-Slot-Konzept von Qt in C++ durch Erzeugen einer moc-Datei mit entsprechenden Einträgen

    http://www.jtz.org.pl/Inne/QT-Tutorial/moc.html
    http://makepp.sourceforge.net/1.18/t_qt.html
    http://lists.trolltech.com/qt-interest/2001-05/msg00913.html

    -> FAQ

    MFG



  • Normalerweise machst du es so:

    moc headerdatei.h -o moc_implementierung.cpp
    g++ -c moc_implementierung.cpp -o moc_implementierung.o

    und dann beim Linken auch noch die moc_implementierung.o dazutun.

    Das ganze macht man dann auch nicht händisch, sondern steuert es mit dem Makefile.

    Und für reine Qt Projekte kann man aber auch QMake verwenden, das alles automatisch macht. Ich verstehe nicht, warum es bei dir nicht geklappt hat.



  • Ponto schrieb:

    Normalerweise machst du es so:

    moc headerdatei.h -o moc_implementierung.cpp
    g++ -c moc_implementierung.cpp -o moc_implementierung.o

    und dann beim Linken auch noch die moc_implementierung.o dazutun.

    Das ganze macht man dann auch nicht händisch, sondern steuert es mit dem Makefile.

    Und für reine Qt Projekte kann man aber auch QMake verwenden, das alles automatisch macht. Ich verstehe nicht, warum es bei dir nicht geklappt hat.

    kann ich im dev-cpp das makefile editieren...oder einstellungen vornehmen, denn dev-cpp erzeugt ja eigenstädig das makefile!? will das er das moc eigenständig macht...denn ich will das projekt als vorlange für QT Projekte speichern...

    MFG



  • Schau mal hier:
    http://doc.trolltech.com/4.0/qmake-manual.html
    über den "Einbau" in DevC++ hab ich mir diesbezüglich aber noch keine Gedanken gemacht 🙂



  • ok,
    kannst du dieses example bitte compilieren?
    findest du unter:
    ...\examples\mainwindows\application

    oder auch hier:
    http://doc.trolltech.com/4.0/mainwindows-application.html

    sag mir ob du auch diese error bekommst!?

    MFG



  • Das Kompilieren ist ja nicht das Problem:
    - (nicht notwendig aber bequemer) füg das Dev-Cpp\bin-Verzeichnis der PATH-Variabel deines Systems hinzu
    - Wechsel ins Verzeichnis "examples/mainwindows/application"
    - Führe dort "qmake application.pro" aus
    - Führ dann "make -f Makefile" aus
    - Jetzt findest du in "examples/mainwindows/application/release" dein fertiges Programm 😉

    Alles was man machen muss, ist also qmake und make.

    Du kannst es auch in Dev-Cpp einbinden:
    "Project Options/Makefile/Use custom Makefile" und dort die von qmake erstellte Makefile auswählen. Erzeugt zwar einige Fehlermeldungen beim Kompilieren, aber ein Blick in /release zeigt, dass er es trotzdem kompilieren konnte ...
    Dev-Cpp macht da irgendwelche komischen Sachen beim Aufruf von make (siehe Compile Log), die mir zu doof zum Anschauen sind *g*



  • tja...wie kann ich dem dev-cpp sagen mach zuerst moc vom header file, die moc datei soll dann heissen: #include "mainwindow.moc"

    hast du eigentlich eine vorlage für ein QT projekt...zeig doch mal!

    MFG



  • ich hab nun ein makefile geschrieben bzw. abgeändert, und das klappt super ohne errors...
    wie kann ich nun eine vorlage machen...und sagen benutze dieses makefile...das wär noch schön, wenn sowas ginge...!?

    MFG

    makefile:

    # Project: Projekt1
    # Makefile created by Dev-C++ 4.9.9.2
    
    CPP  = g++.exe
    CC   = gcc.exe
    MOC  = moc.exe
    WINDRES = windres.exe
    RES  = 
    OBJ = moc_mainwindow.o mainwindow.o main.o $(RES)
    LINKOBJ  = main.o mainwindow.o $(RES)
    LIBS =  -L"lib" -L"C:/Qt4.0.0/lib" -L"C:/Programme/Dev-Cpp/wxWidgets-2.6.1-msw-static/lib" -mwindows Qt4.0.0/lib/libQt3Support4.a Qt4.0.0/lib/libQtAssistantClient.a Qt4.0.0/lib/libQtCore4.a Qt4.0.0/lib/libQtDesigner4.a Qt4.0.0/lib/libQtDesignerComponents4.a Qt4.0.0/lib/libQtGui4.a Qt4.0.0/lib/libqtmain.a Qt4.0.0/lib/libQtNetwork4.a Qt4.0.0/lib/libQtOpenGL4.a Qt4.0.0/lib/libQtSql4.a Qt4.0.0/lib/libQtXml4.a   
    INCS =  -I"include" 
    CXXINCS =  -I"lib/gcc/mingw32/3.4.2/include"  -I"include/c++/3.4.2/backward"  -I"include/c++/3.4.2/mingw32"  -I"include/c++/3.4.2"  -I"include"  -I"C:/Qt4.0.0/include"  -I"C:/Qt4.0.0/include/ActiveQt"  -I"C:/Qt4.0.0/include/Qt"  -I"C:/Qt4.0.0/include/Qt3Support"  -I"C:/Qt4.0.0/include/QtAssistant"  -I"C:/Qt4.0.0/include/QtCore"  -I"C:/Qt4.0.0/include/QtDesigner"  -I"C:/Qt4.0.0/include/QtGui"  -I"C:/Qt4.0.0/include/QtMotif"  -I"C:/Qt4.0.0/include/QtNetwork"  -I"C:/Qt4.0.0/include/QtNsPlugin"  -I"C:/Qt4.0.0/include/QtOpenGL"  -I"C:/Qt4.0.0/include/QtOpenGL"  -I"C:/Qt4.0.0/include/QtSql"  -I"C:/Qt4.0.0/include/QtXml"  -I"C:/Programme/Dev-Cpp/wxWidgets-2.6.1-msw-static/include"  -I"C:/Programme/Dev-Cpp/wxWidgets-2.6.1-msw-static/lib/wx/include/msw-ansi-release-static-2.6" 
    BIN  = Projekt1.exe
    CXXFLAGS = $(CXXINCS)  
    CFLAGS = $(INCS)  
    RM = rm -f
    
    .PHONY: all all-before all-after clean clean-custom
    
    all: all-before Projekt1.exe all-after
    
    clean: clean-custom
    	${RM} $(OBJ) $(BIN)
    
    $(BIN): $(OBJ)
    	$(CPP) $(LINKOBJ) -o "Projekt1.exe" $(LIBS)
    
    main.o: main.cpp
    	$(CPP) -c main.cpp -o main.o $(CXXFLAGS)
    
    mainwindow.o: mainwindow.cpp
    	$(CPP) -c mainwindow.cpp -o mainwindow.o $(CXXFLAGS)
    
    moc_mainwindow.o: moc_mainwindow.cpp mainwindow.h
    	$(CPP) -c moc_mainwindow.cpp -o moc_mainwindow.o $(CXXFLAGS)
    
    moc_mainwindow.cpp: mainwindow.cpp
    	$(MOC) mainwindow.h -o moc_mainwindow.cpp $(CXXFLAGS)
    


  • Hi,

    Ich hab gerade den Thread gelesen und bin auch an der Stelle, wo man moc in DevCpp integrieren möchte. Da es leider keinen Custom Build Step gibt, sieht meine Lösung dabei wie folgt aus:

    Zum Nachmachen: Tutorial 7 wurde benutzt

    Zunächst mal muß man dem Projekt ein dummy-moc hinzufügen. In meinem Fall ist die Klasse LCDRange betroffen (lcdrange.cpp bzw h). Ich habe also eine Datei namens "moc_lcdrange.cpp" hinzugefügt. Da DevCpp keine unbekannten Dateien akzeptiert, ist es blöderweise erforderlich, eine neue Datei anzulegen und diese zu speichern (Inhalt ist egal, der wird später eh überschrieben).

    Nun geht man in die Projekt Optionen, wählt das Tab "Dateien" und das hinzugefügte dummy-moc aus. Dort aktiviert man die Option "Überschreibe Build Kommando". Oberhalb des eigentlichen Kompileraufrufs schreibt man nun "moc lcdrange.h -o moc_lcdrange.cpp", sodaß vor dem kompilieren dieser jenigen Datei sie zunächst mal erzeugt wird.

    Das wars eigentlich schon, das Projekt neu compilieren und es sollte gehen.

    Eventuell kann man auch ein dummy Sourcefile erzeugen, welches man prioritätstechnisch zuerst kompiliert, was aber überhaupt keinen Kompileraufruf enthält, sondern nur das/die moc(s) erzeugt.

    Gruß
    Michael



  • ". Oberhalb des eigentlichen Kompileraufrufs schreibt man nun "moc lcdrange.h -o moc_lcdrange.cpp", sodaß vor dem kompilieren dieser jenigen Datei sie zunächst mal erzeugt wird.

    wo oberhalb?



  • Also ich mache nur jedesmal, wenn ich eine neue Klasse habe, die moc-Files
    braucht ein

    [n]make mocables
    

    Dadurch werden die noch nötigen Dateien generiert und ich kann sie meiner IDE
    hinzufügen.



  • wo oberhalb?

    Oberhalb heißt, eine Zeile über dem Kompileraufruf (der ja normalerweise alleine in der obersten Zeile lokalisiert ist), zeitlich gesehen also direkt davor



  • einstellungen für das dummy-moc file:

    In Kompilation einbeziehen
    Ins Linken einbeziehen
    Kompiliere Datei als C++
    Überschreibe Build Kommando

    moc smssender.h -o moc_smssender.cpp
    $(CPP) -c moc_smssender.cpp -o moc_smssender.o $(CXXFLAGS)
    

    ergebniss:

    Compiler: Default compiler
    Building Makefile: "C:\Dokumente und Einstellungen\Gerald\Desktop\SMS Sender\Makefile.win"
    Führt  make... aus
    make.exe -f "C:\Dokumente und Einstellungen\Gerald\Desktop\SMS Sender\Makefile.win" all
    g++.exe main.o smssender.o moc_smssender.o  -o "SMS Sender.exe" -L"lib" -L"C:/Qt4.0.0/lib" -L"C:/Programme/Dev-Cpp/wxWidgets-2.6.1-msw-static/lib" -mwindows ../../../../Qt4.0.0/lib/libQt3Support4.a ../../../../Qt4.0.0/lib/libQtAssistantClient.a ../../../../Qt4.0.0/lib/libQtCore4.a ../../../../Qt4.0.0/lib/libQtDesigner4.a ../../../../Qt4.0.0/lib/libQtDesignerComponents4.a ../../../../Qt4.0.0/lib/libQtGui4.a ../../../../Qt4.0.0/lib/libqtmain.a ../../../../Qt4.0.0/lib/libQtNetwork4.a ../../../../Qt4.0.0/lib/libQtOpenGL4.a ../../../../Qt4.0.0/lib/libQtSql4.a ../../../../Qt4.0.0/lib/libQtXml4.a  
    
    moc_smssender.o(.text+0x100):moc_smssender.cpp: multiple definition of `SMSSender::metaObject() const'
    smssender.o(.text+0x9e6):smssender.cpp: first defined here
    moc_smssender.o(.text+0x10a):moc_smssender.cpp: multiple definition of `SMSSender::qt_metacast(char const*)'
    smssender.o(.text+0x9f0):smssender.cpp: first defined here
    moc_smssender.o(.text+0x158):moc_smssender.cpp: multiple definition of `SMSSender::qt_metacall(QMetaObject::Call, int, void**)'
    
    smssender.o(.text+0xa3e):smssender.cpp: first defined here
    moc_smssender.o(.data+0x0):moc_smssender.cpp: multiple definition of `SMSSender::staticMetaObject'
    
    smssender.o(.data+0x0):smssender.cpp: first defined here
    collect2: ld returned 1 exit status
    
    make.exe: *** ["SMS] Error 1
    
    Ausführung beendet
    


  • Compiler: Default compiler
    Building Makefile: "C:\Dokumente und Einstellungen\Gerald\Desktop\SMS Sender\Makefile.win"
    Führt make... aus
    make.exe -f "C:\Dokumente und Einstellungen\Gerald\Desktop\SMS Sender\Makefile.win" all
    g++.exe main.o smssender.o moc_smssender.o -o "SMS Sender.exe" -L"lib" -L"C:/Qt4.0.0/lib" -L"C:/Programme/Dev-Cpp/wxWidgets-2.6.1-msw-static/lib" -mwindows ../../../../Qt4.0.0/lib/libQt3Support4.a ../../../../Qt4.0.0/lib/libQtAssistantClient.a ../../../../Qt4.0.0/lib/libQtCore4.a ../../../../Qt4.0.0/lib/libQtDesigner4.a ../../../../Qt4.0.0/lib/libQtDesignerComponents4.a ../../../../Qt4.0.0/lib/libQtGui4.a ../../../../Qt4.0.0/lib/libqtmain.a ../../../../Qt4.0.0/lib/libQtNetwork4.a ../../../../Qt4.0.0/lib/libQtOpenGL4.a ../../../../Qt4.0.0/lib/libQtSql4.a ../../../../Qt4.0.0/lib/libQtXml4.a

    moc_smssender.o(.text+0x100):moc_smssender.cpp: multiple definition of SMSSender::metaObject() const' smssender.o(.text+0x9e6):smssender.cpp: first defined here moc\_smssender.o(.text+0x10a):moc\_smssender.cpp: multiple definition ofSMSSender::qt_metacast(char const*)'
    smssender.o(.text+0x9f0):smssender.cpp: first defined here
    moc_smssender.o(.text+0x158):moc_smssender.cpp: multiple definition of `SMSSender::qt_metacall(QMetaObject::Call, int, void**)'

    smssender.o(.text+0xa3e):smssender.cpp: first defined here
    moc_smssender.o(.data+0x0):moc_smssender.cpp: multiple definition of `SMSSender::staticMetaObject'

    smssender.o(.data+0x0):smssender.cpp: first defined here
    collect2: ld returned 1 exit status

    make.exe: *** ["SMS] Error 1

    Ausführung beendet

    Sieht so aus, als wäre das moc bereits anderweitig eingebunden.
    Bei mir funktioniert das so, wie beschrieben.

    Phiele Grüze
    Sylphius



  • @sylphius
    schick mir bitte mal dein projekt dann schau ich nach was ich falsch mache...
    wär klasse
    email: 5aht@gmx.at

    bye


Anmelden zum Antworten