PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Qt-Code mit Fehlern!



Gartenzwerg
03-10-2003, 07:57
hi,
ich habe ein Qt-Programm unter Linux geschrieben (es ist noch nicht fertig) und mit Qt 3.0 übersetzt und es funktioniert einwandfrei. Nun wollte ich es auch für Windows umsetzen, doch erhalte ich VC++6 sehr viele Linker-Errors die für mich alle keinen wirklichen Sinn ergeben.

--------------------Konfiguration: Dienstplaner - Win32 Release--------------------
Kompilierung läuft...
arbeitsfenster.cpp
hauptfenster.cpp
main.cpp
moc_arbeitsfenster.cpp
moc_hauptfenster.cpp
Generieren von Code...
Linker-Vorgang läuft...
moc_arbeitsfenster.obj : error LNK2005: "public: virtual char const * __thiscall Arbeitsfenster::className(void)const " (?className@Arbeitsfenster@@UBEPBDXZ) bereits in arbeitsfenster.obj definiert
moc_arbeitsfenster.obj : error LNK2005: "protected: virtual void __thiscall Arbeitsfenster::initMetaObject(void)" (?initMetaObject@Arbeitsfenster@@MAEXXZ) bereits in arbeitsfenster.obj definiert
moc_arbeitsfenster.obj : error LNK2005: "public: static class QString __cdecl Arbeitsfenster::tr(char const *)" (?tr@Arbeitsfenster@@SA?AVQString@@PBD@Z) bereits in arbeitsfenster.obj definiert
moc_arbeitsfenster.obj : error LNK2005: "public: static class QMetaObject * __cdecl Arbeitsfenster::staticMetaObject(void)" (?staticMetaObject@Arbeitsfenster@@SAPAVQMetaObjec t@@XZ) bereits in arbeitsfenster.obj definiert
moc_arbeitsfenster.obj : error LNK2005: "private: static class QMetaObject * Arbeitsfenster::metaObj" (?metaObj@Arbeitsfenster@@0PAVQMetaObject@@A) bereits in arbeitsfenster.obj definiert
moc_hauptfenster.obj : error LNK2005: "public: virtual char const * __thiscall Hauptfenster::className(void)const " (?className@Hauptfenster@@UBEPBDXZ) bereits in hauptfenster.obj definiert
moc_hauptfenster.obj : error LNK2005: "protected: virtual void __thiscall Hauptfenster::initMetaObject(void)" (?initMetaObject@Hauptfenster@@MAEXXZ) bereits in hauptfenster.obj definiert
moc_hauptfenster.obj : error LNK2005: "public: static class QString __cdecl Hauptfenster::tr(char const *)" (?tr@Hauptfenster@@SA?AVQString@@PBD@Z) bereits in hauptfenster.obj definiert
moc_hauptfenster.obj : error LNK2005: "public: static class QMetaObject * __cdecl Hauptfenster::staticMetaObject(void)" (?staticMetaObject@Hauptfenster@@SAPAVQMetaObject@ @XZ) bereits in hauptfenster.obj definiert
moc_hauptfenster.obj : error LNK2005: "private: static class QMetaObject * Hauptfenster::metaObj" (?metaObj@Hauptfenster@@0PAVQMetaObject@@A) bereits in hauptfenster.obj definiert
arbeitsfenster.obj : error LNK2001: Nichtaufgeloestes externes Symbol "public: static class QString __cdecl Arbeitsfenster::tr(char const *,char const *)" (?tr@Arbeitsfenster@@SA?AVQString@@PBD0@Z)
hauptfenster.obj : error LNK2001: Nichtaufgeloestes externes Symbol "public: static class QString __cdecl Hauptfenster::tr(char const *,char const *)" (?tr@Hauptfenster@@SA?AVQString@@PBD0@Z)
Release/Dienstplaner.exe : fatal error LNK1120: 2 unaufgeloeste externe Verweise
Fehler beim Ausführen von link.exe.

Dienstplaner.exe - 13 Fehler, 0 Warnung(en)

Ich habe schon in einem anderen Forum gefragt, dort meinte man es ist ein Synatxfehler (aber unter Linux funzt es einwandfrei).

Ich weiß, dass dies ein Unix - Programmierer - Forum ist, aber mir wurde geraten hier zu fragen, da hier Leute sein sollen, die sich mit Qt auskennen.

Tschau Gartenzwerg

axeljaeger
03-10-2003, 10:43
Quellcode? Ich schätze mal, das du irgendwelche Methodenbodys doppelt definiert hast.

Gartenzwerg
03-10-2003, 10:54
hi,
hätte ich ja gleich mitangegeben können. :o

http://www.gikrasoft.de.vu/downloads/Dienstplaner.zip

Wäre echt nett, wenn jemand den durchsehen könnte.
Leider ist er nicht besonders gut kommentiert. *sorry*

Tschau Gartenzwerg

anda_skoa
03-10-2003, 12:02
Selbes .pro File unter Linux und Windows?

Sieht so aus, als wäre da ein MOC File inkludiert und wird aber auch getrennt kompiliert und gelinkt.

Ciao,
_

P.S. dein zip lässt sich nicht entzippem

Gartenzwerg
03-10-2003, 14:41
hi,
jo stimmt sowas dummes aber auch, jetzt sind es nur noch drei Fehler:
--------------------Konfiguration: Dienstplaner - Win32 Release--------------------
Kompilierung läuft...
arbeitsfenster.cpp
dienst.cpp
hauptfenster.cpp
main.cpp
Generieren von Code...
Linker-Vorgang läuft...
arbeitsfenster.obj : error LNK2001: Nichtaufgeloestes externes Symbol "public: static class QString __cdecl Arbeitsfenster::tr(char const *,char const *)" (?tr@Arbeitsfenster@@SA?AVQString@@PBD0@Z)
hauptfenster.obj : error LNK2001: Nichtaufgeloestes externes Symbol "public: static class QString __cdecl Hauptfenster::tr(char const *,char const *)" (?tr@Hauptfenster@@SA?AVQString@@PBD0@Z)
Release/Dienstplaner.exe : fatal error LNK1120: 2 unaufgeloeste externe Verweise
Fehler beim Ausführen von link.exe.

Dienstplaner.exe - 3 Fehler, 0 Warnung(en)

irgendetwas haut mit QString nicht hin. qstring.h ist aber eingebunden.

Tschau Gartenzwerg

PS: zip-Archiv erneuert

Gartenzwerg
03-10-2003, 15:52
hi,

achso vergessen: unter Windows nutze ich die Qt 2.3 non-commercial-Edititon

Hoffe ihr könnt mir helfen!

Tschau Gartenzwerg

anda_skoa
03-10-2003, 16:04
Die beiden Symbol sind ansich im moc_arbeitsfenster.cpp

Nimm mal die include der moc Dateien raus und mach einen rebuild.
Vielleicht geht das extra kompilieren und dazu linken.

Noch ein paar Anmerkungen:
Deine Methoden zum Parsen der Farben sind nicht notwendig, Strng im Format #RRGGBB kann QColor direkt verstehen und hat dafür einen Konstruktor.

Wenn du wo einen Qstring übergibst, mach statt


Klasse::methode(QString para)

besser eine konstante Referenz


Klasse::methode(const QString& para)


Das ist bei Parametern mit Klassen als Typ effizienter.

Ciao,
_

Gartenzwerg
04-10-2003, 07:51
hi,

danke für den Tipp und fürs durchsehen des Quellcodes!

Wenn ich es einzeln compilieren und linken möchte, ist es mir nicht möglich die moc_*fenster.obj zu erzeugen, da er beim compilieren folgenden Fehler meldet:

E:\Eigene Dateien\Sebastian\GiKraSoft\Dienstplaner>nmake moc_arbeitsfenster.obj

Microsoft (R) Program Maintenance-Dienstprogramm: Version 6.00.8168.0
Copyright (C) Microsoft Corp 1988-1998. Alle Rechte vorbehalten.

cl -c -nologo -W3 -O1 -DNO_DEBUG -I"D:\qt\include" -Fomoc_arbeitsfenster
.obj moc_arbeitsfenster.cpp
moc_arbeitsfenster.cpp
D:\qt\include\qcstring.h(50) : fatal error C1083: Include-Datei kann nicht geoef
fnet werden: 'string.h': No such file or directory
NMAKE : fatal error U1077: 'D:\PROGRA~1\MICROS~1\VC98\BIN\cl.exe' : Rueckgabe-Co
de '0x2'
Stop.


die Pfade stimmen und die string.h ist garantiert vorhanden, woran liegt das?

Tschau Gartenzwerg

anda_skoa
04-10-2003, 10:17
Hmm, eigenartig.
Scheint als wäre das Makefile nicht richtig generiert worden.

Eigentlich ist es nur wichtig, dass beim Lauf von tmake oder qmake keine include Direktiven für moc Dateien in den cpp Dateien sind.

Dann generiert es Makefile Regeln für das Erstellen, Kompilieren und Linken der Moc Files.

So sollte dann ein einfaches
nmake
reichen.

Falls es nicht klappt, kann ich es am Montag in der Firma selbst unter Windows versuchen.

Ciao,
_

Gartenzwerg
04-10-2003, 12:23
hi,
ok hab die Direktive auskommentiert, aber trotzdem der selbe Fehler:



E:\Eigene Dateien\Sebastian\GiKraSoft\Dienstplaner>nmake

Microsoft (R) Program Maintenance-Dienstprogramm: Version 6.00.8168.0
Copyright (C) Microsoft Corp 1988-1998. Alle Rechte vorbehalten.

cl -c -nologo -W3 -O1 -DNO_DEBUG -I"D:\qt\include" -Foarbeitsfenster.obj
arbeitsfenster.cpp
arbeitsfenster.cpp
D:\qt\include\qcstring.h(50) : fatal error C1083: Include-Datei kann nicht geoef
fnet werden: 'string.h': No such file or directory
NMAKE : fatal error U1077: 'D:\PROGRA~1\MICROS~1\VC98\BIN\cl.exe' : Rueckgabe-Co
de '0x2'
Stop.



Das Makefile:


################################################## ###########################
# Makefile for building Dienstplaner
# Generated by tmake at 13:17, 2003/10/04
# Project: Dienstplaner
# Template: app
################################################## ###########################

####### Compiler, tools and options

CC = cl
CXX = cl
CFLAGS = -nologo -W3 -O1 -DNO_DEBUG
CXXFLAGS= -nologo -W3 -O1 -DNO_DEBUG
INCPATH = -I"$(QTDIR)\include"
LINK = link
LFLAGS = /NOLOGO /SUBSYSTEM:windows
LIBS = $(QTDIR)\lib\qt.lib kernel32.lib user32.lib gdi32.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib imm32.lib winmm.lib wsock32.lib
MOC = moc
UIC = uic

ZIP = zip -r -9

####### Files

HEADERS = arbeitsfenster.h \
confreader.h \
dienst.h \
hauptfenster.h \
xmlparser.h
SOURCES = arbeitsfenster.cpp \
dienst.cpp \
hauptfenster.cpp \
main.cpp
OBJECTS = arbeitsfenster.obj \
dienst.obj \
hauptfenster.obj \
main.obj
INTERFACES =
UICDECLS =
UICIMPLS =
SRCMOC = moc_arbeitsfenster.cpp \
moc_hauptfenster.cpp
OBJMOC = moc_arbeitsfenster.obj \
moc_hauptfenster.obj
DIST =
TARGET = Dienstplaner.exe
INTERFACE_DECL_PATH = .

####### Implicit rules

.SUFFIXES: .cpp .cxx .cc .c

.cpp.obj:
$(CXX) -c $(CXXFLAGS) $(INCPATH) -Fo$@ $<

.cxx.obj:
$(CXX) -c $(CXXFLAGS) $(INCPATH) -Fo$@ $<

.cc.obj:
$(CXX) -c $(CXXFLAGS) $(INCPATH) -Fo$@ $<

.c.obj:
$(CC) -c $(CFLAGS) $(INCPATH) -Fo$@ $<

####### Build rules

all: $(TARGET)

$(TARGET): $(UICDECLS) $(OBJECTS) $(OBJMOC)
$(LINK) $(LFLAGS) /OUT:$(TARGET) @<<
$(OBJECTS) $(OBJMOC) $(LIBS)
<<

moc: $(SRCMOC)

tmake: Makefile

Makefile: Dienstplaner.pro
tmake Dienstplaner.pro -o Makefile

dist:
$(ZIP) Dienstplaner.zip Dienstplaner.pro $(SOURCES) $(HEADERS) $(DIST) $(INTERFACES)

clean:
-del arbeitsfenster.obj
-del dienst.obj
-del hauptfenster.obj
-del main.obj
-del moc_arbeitsfenster.cpp
-del moc_hauptfenster.cpp
-del moc_arbeitsfenster.obj
-del moc_hauptfenster.obj
-del $(TARGET)

####### Compile

arbeitsfenster.obj: arbeitsfenster.cpp \
arbeitsfenster.h \
confreader.h \
dienst.h

dienst.obj: dienst.cpp \
dienst.h \
confreader.h

hauptfenster.obj: hauptfenster.cpp \
hauptfenster.h \
arbeitsfenster.h \
confreader.h \
dienst.h \
xmlparser.h

main.obj: main.cpp \
hauptfenster.h \
arbeitsfenster.h \
confreader.h \
dienst.h \
xmlparser.h

moc_arbeitsfenster.obj: moc_arbeitsfenster.cpp \
arbeitsfenster.h \
confreader.h \
dienst.h

moc_hauptfenster.obj: moc_hauptfenster.cpp \
hauptfenster.h \
arbeitsfenster.h \
confreader.h \
dienst.h \
xmlparser.h

moc_arbeitsfenster.cpp: arbeitsfenster.h
$(MOC) arbeitsfenster.h -o moc_arbeitsfenster.cpp

moc_hauptfenster.cpp: hauptfenster.h
$(MOC) hauptfenster.h -o moc_hauptfenster.cpp



Was mach ich falsch?

Tschau Gartenzwerg

Gartenzwerg
07-10-2003, 17:27
hi,

@ anda_skoa: würdest du es bitte probieren

Tschau Gartenzwerg

anda_skoa
08-10-2003, 14:22
Tut mir leid, hatte ganz drauf vergessen.

Habs jetzt ausprobiert:
Zuerst gings nicht, aber nachdem ich die #include "moc_" aus den Dateien arbeitsfenster.cpp und hauptfenster.cpp rausgenommen hatte und da Makefile gelöscht und neu erzeugt hatte, gings einwandfrei.


Ciao,
_

Gartenzwerg
08-10-2003, 17:09
hi,
bin ich blöd oder was?
welche Qt-Version hast du?

Ich erhalte trotzdem folgende Fehler:


Temporäre Dateien und Ausgabedateien für "Dienstplaner2 - Win32 Debug" werden gelöscht.
--------------------Konfiguration: Dienstplaner2 - Win32 Debug--------------------
Kompilierung läuft...
main.cpp
dienst.cpp
hauptfenster.cpp
arbeitsfenster.cpp
Linker-Vorgang läuft...
hauptfenster.obj : error LNK2001: Nichtaufgeloestes externes Symbol "public: static class QString __cdecl Hauptfenster::tr(char const *,char const *)" (?tr@Hauptfenster@@SA?AVQString@@PBD0@Z)
arbeitsfenster.obj : error LNK2001: Nichtaufgeloestes externes Symbol "public: static class QString __cdecl Arbeitsfenster::tr(char const *,char const *)" (?tr@Arbeitsfenster@@SA?AVQString@@PBD0@Z)
Debug/Dienstplaner2.exe : fatal error LNK1120: 2 unaufgeloeste externe Verweise
Fehler beim Ausführen von link.exe.

Dienstplaner2.exe - 3 Fehler, 0 Warnung(en)


ich denke weiterhin, dass es mit QTranslator zusammenhängt, da er auch Verweise auf tr() vermisst und lupdate, linguist, lrelease nicht mitgeliefert wurden.
Kann es daran liegen?

Tschau Gartenzwerg

Gartenzwerg
09-10-2003, 06:24
hi,
hab gestern nochmal alle tr()-Befehle durch normale Strings ersetzt und es funktioniert einwandfrei, wenn keiner mehr eine Idee hat wie ich die Fehler beheben kann, muss ich mich wohl auf eine Sprache beschränken oder eine kommerzielle Edition von Qt kaufen.

Tschau Gartenzwerg