Warning: No relevant classes found. No output generated.

Verschiedenes zu Qt
Antworten
Seikilos
Beiträge: 34
Registriert: 9. Juni 2009 06:43

Warning: No relevant classes found. No output generated.

Beitrag 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?
Mani99
Beiträge: 244
Registriert: 15. April 2009 10:46
Wohnort: München

Beitrag von Mani99 »

Lass mal ein qmake drüber laufen, und sonst ein clear und dann sollte es wieder gehen!
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

"moc" muss auf Header(!)-Dateien ausgeführt werden, nicht auf *.c*.
Wie das aber bei VS und cmake eingerichtet wird.. keine Ahnung...
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Zeig mal dein CMakeLists.txt und die komplette Foo.h.
Seikilos
Beiträge: 34
Registriert: 9. Juni 2009 06:43

Beitrag 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})

Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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 :P

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.
Seikilos
Beiträge: 34
Registriert: 9. Juni 2009 06:43

Beitrag 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
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Kannst du nirgendwo in den Settings die Codierung für generiertes Zeugs einstellen? Wenn nei, dann nimm ne andere IDE :P
Qt-Creator, oder Eclipse. K.A. was sonst noch gut ist auf Windows.
Seikilos
Beiträge: 34
Registriert: 9. Juni 2009 06:43

Beitrag von Seikilos »

Wenn ich Header und CPP einzeln erstelle sind diese ja ANSI. Nur das eine Feature macht Probleme
Antworten