Probleme mit Q_OBJECT (MAC)

Alles rund um die Programmierung mit Qt
Antworten
Snoopy
Beiträge: 5
Registriert: 26. Oktober 2004 13:46

Probleme mit Q_OBJECT (MAC)

Beitrag von Snoopy »

Hi...
ich wollte, mal anfangen mit der QT zu programmieren und steh da vornem Problem (wer hätte das gedacht... :-))
m
Wenn ich in meinem Programm das Marco Q_OBJECT einsetze, kommt die Fehlermeldung:

/usr/bin/ld: warning prebinding disabled because of undefined symbols
/usr/bin/ld: Undefined symbols:
___vt_5prog
___vt_5prog.12QPaintDevice
make: *** [prog.app/Contents/MacOS/prog] Error 1

Das Programm sollte eigentlich n Dailog Fenster anzeigen (das passiert auch wenn ich Q_OBJECT auskommentiere)...

Hier mein Quellcode:

// prog.h:
#ifndef _diag_
#define _diag_

#include <qdialog.h>

class meins : public QDialog
{
//Q_OBJECT
public:
meins(QWidget *parten = 0, const char* name= 0);

};

#endif

//prog.cpp:
#include "prog.h"

meins::meins(QWidget *parent, const char* name) : QDialog(parent,name)
{

}

//main.cpp
#include <qapplication.h>
#include "prog.h"

int main(int argc,char** argv)
{
QApplication obj(argc,argv);
meins *ding = new meins;
obj.setMainWidget(ding);
ding->show();
return obj.exec();
}

Habt ihr ne Idee???
needle
Beiträge: 33
Registriert: 28. September 2004 14:38
Kontaktdaten:

Beitrag von needle »

moin,

du hast einmal in prog.h zeile 11 *parten anstatt *parent geschrieben
(aber vielleicht in deinem code ja nicht, denn du sagst ja, sobald du Q_OBJECT auskommentierst gehts ...)

versuch mal ein

Code: Alles auswählen

#include <qobject.h>
in prog.h


gruss,

needle
Im Handbuch stand: 'Anforderung: Windows XP oder besser'
... also hab ich Debian installiert :-)
Spring-Daniel
Beiträge: 40
Registriert: 4. Oktober 2004 16:26

Beitrag von Spring-Daniel »

Hast Du Dein Programm mithilfe von qmake compiliert?

Wenn Du Q_OBJECT verwendest, muss der moc Deine Header-Dateien lesen, damit er Qt-spezifischen Code generiert, der dann zu deinem Programm dauzgelinkt wird.

Falls Du qmake verwendest, fuege einfach den Eintrag

Code: Alles auswählen

HEADERS += prog.h 
zu der Projektdatei dazu, und alles sollte funktionieren.
Falls Du qmake nicht verwendest, dann fang damit an, es zu verwenden. (:
needle
Beiträge: 33
Registriert: 28. September 2004 14:38
Kontaktdaten:

Beitrag von needle »

sobald du den QT-Designer für so ein projekt benutzt (als .pro) , fügt er das übrigens automatisch in das projekt file ein.

aber besser ist vielleicht, gerade im hinblick darauf, dass man nicht immer so relativ simple programme schreibt, sich gleich selbst mit den mechanismen zu beschäftigen.

needle
Im Handbuch stand: 'Anforderung: Windows XP oder besser'
... also hab ich Debian installiert :-)
Snoopy
Beiträge: 5
Registriert: 26. Oktober 2004 13:46

Beitrag von Snoopy »

Zuerst zu Spring-Daniel:
Der Eintrag: "HEADERS += prog.h" steht schon in der Projektdatei und
ich verwende qmake :-)

Jetzt zu Needle:
Ich hab jetzt die qobject.h eingefügt (und das parent geändert :-)):

// prog.h:
#ifndef _diag_
#define _diag_

#include <qdialog.h>
#include <qobject.h>
class meins : public QDialog
{
Q_OBJECT
public:
meins(QWidget *parent = 0, const char* name= 0);

};

#endif

jetzt krieg ich nach dem Aufruf: moc prog.h -o moc_prog.cpp
die Fehlermeldung:
Prog.h:0: Warning: No relevant Classes found. No output generatet.
Und dann wieder die andere mit dem PaintDevice

Wisst ihr weiter?

mfg Snoopy
needle
Beiträge: 33
Registriert: 28. September 2004 14:38
Kontaktdaten:

Beitrag von needle »

also bei mir linkt er das sauber ...

poste doch bitte mal dein vom qmake erzeugtes Makefile, da scheint ne Lib nicht richtig angezogen zu werden.

needle

BTW:

mein QMAKE erzeugt sowas in der Art als Makefile (Linux) :

Code: Alles auswählen

#############################################################################
# Makefile for building: dialog
# Generated by qmake (1.06c) (Qt 3.2.3) on: Wed Oct 27 14:28:11 2004
# Project:  dialog.pro
# Template: app
# Command: $(QMAKE) -o Makefile dialog.pro
#############################################################################

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

CC       = gcc
CXX      = g++
LEX      = flex
YACC     = yacc
CFLAGS   = -pipe -Wall -W -O2  -DQT_NO_DEBUG -DQT_SHARED -DQT_THREAD_SUPPORT
CXXFLAGS = -pipe -Wall -W -O2  -DQT_NO_DEBUG -DQT_SHARED -DQT_THREAD_SUPPORT
LEXFLAGS =
YACCFLAGS= -d
INCPATH  = -I/usr/local/qt/mkspecs/default -I. -I$(QTDIR)/include -I.ui/ -I.moc/

LINK     = g++
LFLAGS   =  -Wl,-rpath,$(QTDIR)/lib
LIBS     = $(SUBLIBS) -L$(QTDIR)/lib -L/usr/X11R6/lib -lqt-mt -lXext -lX11 -lm
AR       = ar cqs
RANLIB   =
MOC      = $(QTDIR)/bin/moc
UIC      = $(QTDIR)/bin/uic
QMAKE    = qmake
TAR      = tar -cf
GZIP     = gzip -9f
COPY     = cp -f
COPY_FILE= $(COPY)
COPY_DIR = $(COPY) -r
DEL_FILE = rm -f
SYMLINK  = ln -sf
DEL_DIR  = rmdir
MOVE     = mv -f
CHK_DIR_EXISTS= test -d
MKDIR    = mkdir -p

####### Output directory

OBJECTS_DIR = .obj/


####### Files

HEADERS = prog.h
SOURCES = prog.cpp \
                main.cpp
OBJECTS = .obj/prog.o \
                .obj/main.o
FORMS =
UICDECLS =
UICIMPLS =
SRCMOC   = .moc/moc_prog.cpp
OBJMOC = .obj/moc_prog.o
DIST       = dialog.pro
QMAKE_TARGET = dialog
DESTDIR  =
TARGET   = dialog

first: all
####### Implicit rules

.SUFFIXES: .c .o .cpp .cc .cxx .C

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

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

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

.C.o:
        $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<

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

####### Build rules

all: Makefile $(TARGET)

$(TARGET):  $(UICDECLS) $(OBJECTS) $(OBJMOC)
        $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJMOC) $(LIBS) $(OBJCOMP)

mocables: $(SRCMOC)
uicables: $(UICDECLS) $(UICIMPLS)

$(MOC):
        ( cd $(QTDIR)/src/moc ; $(MAKE) )

Makefile: dialog.pro  /usr/local/qt/mkspecs/default/qmake.conf /usr/local/qt/lib/libqt-mt.prl
        $(QMAKE) -o Makefile dialog.pro
qmake:
        @$(QMAKE) -o Makefile dialog.pro

dist:
        @mkdir -p .obj/dialog && $(COPY_FILE) --parents $(SOURCES) $(HEADERS) $(FORMS) $(DIST) .obj/dialog/ && ( cd `dirname .obj/dialog` && $(TAR) dialog.tar dialog && $(GZIP) dialog.tar ) && $(MOVE) `dirname .obj/dialog`/dialog.tar.gz . && $(DEL_FILE) -r .obj/dialog

mocclean:
        -$(DEL_FILE) $(OBJMOC)
        -$(DEL_FILE) $(SRCMOC)

uiclean:

yaccclean:
lexclean:
clean: mocclean
        -$(DEL_FILE) $(OBJECTS)
        -$(DEL_FILE) *~ core *.core


####### Sub-libraries

distclean: clean
        -$(DEL_FILE) $(TARGET) $(TARGET)


FORCE:

####### Compile

.obj/prog.o: prog.cpp prog.h
        $(CXX) -c $(CXXFLAGS) $(INCPATH) -o .obj/prog.o prog.cpp

.obj/main.o: main.cpp prog.h
        $(CXX) -c $(CXXFLAGS) $(INCPATH) -o .obj/main.o main.cpp

.obj/moc_prog.o: .moc/moc_prog.cpp prog.h
        $(CXX) -c $(CXXFLAGS) $(INCPATH) -o .obj/moc_prog.o .moc/moc_prog.cpp

.moc/moc_prog.cpp: $(MOC) prog.h
        $(MOC) prog.h -o .moc/moc_prog.cpp

####### Install

install: all

uninstall:

Im Handbuch stand: 'Anforderung: Windows XP oder besser'
... also hab ich Debian installiert :-)
Snoopy
Beiträge: 5
Registriert: 26. Oktober 2004 13:46

Beitrag von Snoopy »

Ich habs!!!!!!!!!!!!!!!
Ich hab nochmal n bischen rumgesucht und schließlich in der Trolltech mailing Liste was gefunden.

Es lag daran, das ich die prog.h mit BBedit geschrieben hab. Wenn ich die dann mim vi geöffnet hab, waren lauter Steuerzeichen drin (^M) und die haben dann den moc (?) wohl durcheinandergebracht... Da muß man erstmal drauf kommen (und dann muß einem erstmal nochwas dazu einfallen ...) Was mich nur wundert ist, das er bei den anderen files nicht gemotzt hat.

Ich hoff jetzt mal, dass alles richtig läuft, bin grad den QT designer am kompilieren und da fehlt ne datei widgetdatabase.h. Mal sehen, ob ich die irgendwo herkrieg... (hauptsache was zu tun :-))

Poste dir aber trotzdem nochmal meine make file, vielleicht fällt dir ja nochwas auf...

Auf jeden Fall nochmal vielen Dank für Deine Hilfe...

#############################################################################
# Makefile for building: meins.app/Contents/MacOS/meins
# Generated by qmake (1.07a) (Qt 3.3.3) on: Wed Oct 27 14:34:49 2004
# Project: meins.pro
# Template: app
# Command: $(QMAKE) -o Makefile meins.pro
#############################################################################

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

CC = cc
CXX = c++
LEX = flex
YACC = yacc
CFLAGS = -pipe -Wall -W -Os -DQT_NO_DEBUG -DQT_SHARED -DQT_ACCESSIBILITY_SUPPORT -DQT_TABLET_SUPPORT
CXXFLAGS = -pipe -Wall -W -Os -DQT_NO_DEBUG -DQT_SHARED -DQT_ACCESSIBILITY_SUPPORT -DQT_TABLET_SUPPORT
LEXFLAGS =
YACCFLAGS= -d
INCPATH = -I/Developer/qt/mkspecs/default -I. -I. -I$(QTDIR)/include
LINK = c++
LFLAGS = -headerpad_max_install_names -prebind
LIBS = $(SUBLIBS) -L$(QTDIR)/lib -lqt
AR = ar cq
RANLIB = ranlib -s
MOC = $(QTDIR)/bin/moc
UIC = $(QTDIR)/bin/uic
QMAKE = qmake
TAR = tar -cf
GZIP = gzip -9f
COPY = cp -f
COPY_FILE= cp -f
COPY_DIR = cp -f -r
INSTALL_FILE= $(COPY_FILE)
INSTALL_DIR = $(COPY_DIR)
DEL_FILE = rm -f
SYMLINK = ln -sf
DEL_DIR = rmdir
MOVE = mv -f
CHK_DIR_EXISTS= test -d
MKDIR = mkdir -p

####### Output directory

OBJECTS_DIR = ./

####### Files

HEADERS = prog.h
SOURCES = main.cpp \
prog.cpp
OBJECTS = main.o \
prog.o
FORMS =
UICDECLS =
UICIMPLS =
SRCMOC = moc_prog.cpp
OBJMOC = moc_prog.o
DIST = meins.pro
QMAKE_TARGET = meins
DESTDIR = meins.app/Contents/MacOS/
TARGET = meins.app/Contents/MacOS/meins

first: all
####### Implicit rules

.SUFFIXES: .c .o .cpp .cc .cxx .C

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

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

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

.C.o:
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<

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

####### Build rules

all: Makefile meins.app/Contents/MacOS/../PkgInfo meins.app/Contents/MacOS/../Info.plist $(TARGET)

$(TARGET): $(UICDECLS) $(OBJECTS) $(OBJMOC)
test -d meins.app/Contents/MacOS/ || mkdir -p meins.app/Contents/MacOS/
$(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJMOC) $(OBJCOMP) $(LIBS)

mocables: $(SRCMOC)
uicables: $(UICDECLS) $(UICIMPLS)

$(MOC):
( cd $(QTDIR)/src/moc && $(MAKE) )

Makefile: meins.pro /Developer/qt/mkspecs/default/qmake.conf /Developer/qt/lib/libqt.prl
$(QMAKE) -o Makefile meins.pro
qmake:
@$(QMAKE) -o Makefile meins.pro

meins.app/Contents/MacOS/../PkgInfo:
@test -d meins.app/Contents/MacOS/ || mkdir -p meins.app/Contents/MacOS/
@$(DEL_FILE) meins.app/Contents/MacOS/../PkgInfo
@echo "APPL????" >meins.app/Contents/MacOS/../PkgInfo
meins.app/Contents/MacOS/../Info.plist:
@test -d meins.app/Contents/MacOS/ || mkdir -p meins.app/Contents/MacOS/
@$(DEL_FILE) meins.app/Contents/MacOS/../Info.plist
@sed -e "s,@ICON@,application.icns,g" -e "s,@EXECUTABLE@,meins,g" "/Developer/qt/mkspecs/default/Info.plist.app" >"meins.app/Contents/MacOS/../Info.plist"
dist:
@mkdir -p .tmp/meins && $(COPY_FILE) --parents $(SOURCES) $(HEADERS) $(FORMS) $(DIST) .tmp/meins/ && ( cd `dirname .tmp/meins` && $(TAR) meins.tar meins && $(GZIP) meins.tar ) && $(MOVE) `dirname .tmp/meins`/meins.tar.gz . && $(DEL_FILE) -r .tmp/meins

mocclean:
-$(DEL_FILE) $(OBJMOC)
-$(DEL_FILE) $(SRCMOC)

uiclean:

yaccclean:
lexclean:
clean: mocclean
-$(DEL_FILE) $(OBJECTS)
-$(DEL_FILE) *~ core *.core


####### Sub-libraries

distclean: clean
-$(DEL_FILE) -r meins.app


FORCE:

####### Compile

main.o: main.cpp prog.h

prog.o: prog.cpp prog.h

moc_prog.o: moc_prog.cpp prog.h

moc_prog.cpp: $(MOC) prog.h
$(MOC) prog.h -o moc_prog.cpp

####### Install

install:

uninstall:
Antworten