Seite 1 von 1
Warning: No relevant classes found. No output generated.
Verfasst: 16. Juni 2009 17:00
von Seikilos
Ich hab einen Dialog, welcher eine dazu passende ui Datei hat und die beide in Visual Studio benutzt werden. Aufgesetzt wird das Projekt mittels Cmake, welches meine angegebenen Dateien passend Moc'en soll.
Meine Klasse:
Code: Alles auswählen
#include "ui_Foo.h"
class Foo : public QDialog, private Ui::Foo
{
Q_OBJECT
public:
Foo() { }
}
Alle Dateien sind vorhanden, beim generieren der moc_Foo.cxx bekomme ich allerdings folgende ausgabe:
1>Generating moc_Foo.cxx
1>D:/src/Foo.h(0): Warning: No relevant classes found. No output generated.
Was ist hier das Problem? Die moc Datei
existiert zwar, aber sie ist absolut leer und jede neue Generierung erzeug diese Datei neu, welche dann aber immer leer ist.
Ohne das Q_OBJECT kompiliert er Problemlos, Q_OBJECT ist auch definiert.
Als Folge der leeren moc Datei hab ich natürlich auch nicht aufgelöste Symbole wie
Code: Alles auswählen
public: virtual struct QMetaObject const * __thiscall Foo::metaObject(void)const
Was aber wohl nur die Reaktion auf eine leere moc File ist.
Irgendwelche Tipps?
Verfasst: 16. Juni 2009 18:47
von Mani99
Lass mal ein qmake drüber laufen, und sonst ein clear und dann sollte es wieder gehen!
Verfasst: 16. Juni 2009 18:53
von solarix
"moc" muss auf Header(!)-Dateien ausgeführt werden, nicht auf *.c*.
Wie das aber bei VS und cmake eingerichtet wird.. keine Ahnung...
Verfasst: 16. Juni 2009 19:06
von franzf
Zeig mal dein CMakeLists.txt und die komplette Foo.h.
Verfasst: 17. Juni 2009 09:16
von Seikilos
Mani99 hat geschrieben:Lass mal ein qmake drüber laufen, und sonst ein clear und dann sollte es wieder gehen!
Qmake clean worüber? Das ist ein Cmake projekt.
Ich kann die volle Cmake Datei nicht posten, aber die relevanten Teile :
Code: Alles auswählen
FIND_PACKAGE(Qt4 REQUIRED)
INCLUDE_DIRECTORIES ( ${QT_INCLUDE_DIR} ${QT_QT3SUPPORT_INCLUDE_DIR} ${QT_QTGUI_INCLUDE_DIR} ${QT_QTCORE_INCLUDE_DIR})
ADD_DEFINITIONS(-DQT3_SUPPORT)
SET( QT_LIBS
${QT_QTCORE_LIBRARY}
${QT_QT3SUPPORT_LIBRARY}
${QT_QTGUI_LIBRARY}
${QT_QTOPENGL_LIBRARY}
${QT_QTNETWORK_LIBRARY}
)
SET(PUBLIC_HEADERS ui_Foo.h)
SET( MOC_HEADERS Foo.h)
QT4_WRAP_CPP( QT_MOC_SRCS ${MOC_HEADERS} )
SET( UI_SOURCES Foo.ui)
QT4_WRAP_UI( QTUI_H_SRCS ${UI_SOURCES} )
SET(SOURCE_FILES Foo.cpp)
ADD_EXECUTABLE( FooTool
${PUBLIC_HEADERS}
${MOC_HEADERS}
${QT_MOC_SRCS}
${SOURCE_FILES}
)
TARGET_LINK_LIBRARIES( FooTool ${QT_LIBS})
Verfasst: 17. Juni 2009 09:41
von Christian81
Abgesehen davon das ein ';' am Ende der Klasse und ein 'include <QDialog>' am Anfang fehlt sieht es ok aus.
Ein einfaches 'moc foo.h' auf der Kommandozeile bringt auch den gewünschten Output.
Verfasst: 17. Juni 2009 09:51
von franzf
Da bestehen noch einige CMake-Misverständnisse.
Zu allererst:
Doku
Um den für dich relevanten Teil von Qt zu bekommen reicht ein
Code: Alles auswählen
FIND_PACKAGE (Qt4 REQUIRD)
SET (QT_USE_QT3SUPPORT 1)
SET (QT_USE_QTOPENGL 1)
SET (QT_USE_QTNETWORK 1)
INCLUDE (${QT_USE_FILE})
ADD_EXECUTABLE erstellt dir eine ausführbare Datei, alles nach dem ersten Argument sind zu kompilierende SOurce-Files. Da hat ein *.h (->PUBLIC_HEADERS) nix zu suchen!
Das ui_Foo.h wird ja von dem uic erstellt. Das geht mittels QT4_WRAP_UI().
Und deine Variablenbezeichner sind auch nicht gut gewählt. Wenn du Qt+CMake verwendest, solltest du nicht mit "QT_" anfangen. Die Gefahr, dass du eine von FinQt4.cmake gesetzte Variable überschreibst ist stark gegeben
Zusammengefasst ergibt sich folgendes kurzes CMakeLists.txt:
Code: Alles auswählen
FIND_PACKAGE (Qt4 REQUIRED)
SET (QT_USE_QT3SUPPORT 1)
SET (QT_USE_QTOPENGL 1)
SET (QT_USE_QTNETWORK 1)
INCLUDE (${QT_USE_FILE})
# durch das INCLUDE sind die benötigten Libs in QT_LIBRARIES enthalten, und du musst keine INCLUDE_DIRECTORIES auf Qt-Incs setzen.
SET (MOC_HEADERS Foo.h)
QT4_WRAP_CPP (FooTool_MOC_SRCs ${MOC_HEADERS})
SET (FooTool_UIs Foo.ui)
QT4_WRAP_UI (FooTool_UI_SRCs ${FooTool_UIs})
SET (FooTool_SRCs Foo.cpp)
ADD_EXECUTABLE (FooTool
${FooTool_MOC_SRCs}
${FooTool_UI_SRCs}
${FooTool_SRCs}
)
TARGET_LINK_LIBRARIES (FooTool ${QT_LIBRARIES})
Kann sein dass ich mich irgendwo vertippt hab, aber das findest du selber schnell raus.
Verfasst: 17. Juni 2009 09:52
von Seikilos
Ehm, komisches Problem: moc Foo.h sagt mir immernoch "Warning: No relevant classes found. No output generated."
Nehme ich den Inhalt der Datei und pack ihn in Foo2.h, dann moc't er mir die Datei!
Ich hab festgestellt, das Visual Studio mir Foo.h als UC2-Little Endian Kodierung erzeugt hat! WTF.
Das hat mich nun Stunden gekostet.
Ich hab in VS 2005 eine neue Klasse angelegt, wo VS mir automatisch Header und CPP erzeugt, die sind so kodiert!
Wenn ich über hinzufügen neue Datei und dann Header und CPP einzeln hinzufüge, sind diese ANSI
Verfasst: 17. Juni 2009 10:02
von franzf
Kannst du nirgendwo in den Settings die Codierung für generiertes Zeugs einstellen? Wenn nei, dann nimm ne andere IDE

Qt-Creator, oder Eclipse. K.A. was sonst noch gut ist auf Windows.
Verfasst: 17. Juni 2009 11:10
von Seikilos
Wenn ich Header und CPP einzeln erstelle sind diese ja ANSI. Nur das eine Feature macht Probleme