linking-problem mit qt 3.3.1

Alles rund um die Programmierung mit Qt
Antworten
orca
Beiträge: 5
Registriert: 5. September 2004 17:32

linking-problem mit qt 3.3.1

Beitrag von orca »

Hallo qt-foraner,

zur Zeit möchte ich mich in die QT-programmierung einarbeiten und habe zu dem zweck die entsprechenden pakete von suse 9.1 prof installiert (qt 3.3.1 und gcc 3.3.3). als erstes wollte ich das "hello world"-programm aus tutorial 1 der trolltech-site übersetzen, um zu prüfen, ob dies grundsätzlich funktioniert. das programm besteht einfach aus folgendem code:

Code: Alles auswählen

#include <qapplication.h>
#include <qpushbutton.h>

int main( int argc, char **argv )
{
    QApplication a( argc, argv );

    QPushButton hello( "Hello world!", 0 );
    hello.resize( 100, 30 );

    a.setMainWidget( &hello );
    hello.show();
    return a.exec();
}
Dann habe ich es mit qmake und make übersetzen wollen

andre@linux:~/eigene-dateien/informatik/qt> qmake -project
andre@linux:~/eigene-dateien/informatik/qt> qmake
andre@linux:~/eigene-dateien/informatik/qt> make

also, wie es im tutorial steht.
bis make hat alles geklappt, aber bei make erhielt ich dann folgende fehlermeldung:

Code: Alles auswählen

g++  -o qt qttutorial.o    -L/usr/lib/ -L/usr/X11R6/lib/ -lXext -lX11 -lm
qttutorial.o(.text+0x3b): In function `main':
: undefined reference to `QApplication::QApplication[in-charge](int&, char**)'
qttutorial.o(.text+0x4d): In function `main':
: undefined reference to `QString::QString[in-charge](char const*)'
.
.
irgendwie scheint beim linken etwas falsch zu gehen, so dass noch nicht mal die basisfunktionen gefunden werden. leider habe ich überhaupt
keine ahnung warum(pfade falsch/fehlen (QTDIR-Variable ist gesetzt), doch noch fehlende pakete?) eigentlich sollten doch dank yast alle nötigen pakete
installiert worden sein. gegoogelt habe ich auch schon, jedoch erfolglos,
im englisch-sprachigen forum bin ich auch nicht fündig geworden.
ich weiss, dies ist ws. eine absolute newbie-frage. trotzdem wäre ich euch sehr
dankbar, wenn ihr mir einen hinweis geben könntet.

viele grüße
orca
miketech
Beiträge: 125
Registriert: 3. August 2004 11:19

Beitrag von miketech »

Hi,

sehr eigenartig, normal sollte qmake alles für Dich erledigen. Versuch mal per Hand zu linken mit:

g++ -o qt qttutorial.o -L/usr/lib/ -L/usr/X11R6/lib/ -lqt -lXext -lX11 -lm

und wenn das nicht geht mit:

g++ -o qt qttutorial.o -L/usr/lib/ -L/usr/X11R6/lib/ -L/pfadzuDeinenQtLibs/ -lXext -lX11 -lm -lqt

Und überprüfe mal, ob das $QTDIR auf den richtigen Pfad zeigt und ob sich dort auch die Bibliotheken befinden.

Ansonsten starte mal qtconfig. Hier findest Du bei "Libraries" die Pfade zu den Libs. Überprüfe mal, ob die stimmen.

Gruß

Mike
orca
Beiträge: 5
Registriert: 5. September 2004 17:32

Problem provisorisch gelöst, aber qmake noch wunderlich

Beitrag von orca »

@miketech:
Danke für die schnelle :shock: Antwort!
ich habe das programm nochmals von hand kompiliert (ohne probleme)
und dann mit deinem 2.vorschlag wurde alles gelinkt, (d.h. mit
-L/${QTDIR}/lib/, wobei echo $QTDIR mir den pfad /usr/lib/qt3
anzeigt). Leider bin ich noch etwas ratlos, wie ich qmake dazu veranlasse,
mir dasselbe resultat zu liefern, irgendetwas scheint da falsch konfiguriert zu sein.
habt ihr noch irgendeine idee? (zumindestens einen ansatzpunkt, wo ich mich einlesen sollte...)

nächtliche grüße
orca
miketech
Beiträge: 125
Registriert: 3. August 2004 11:19

Beitrag von miketech »

Hi,

hast Du qtconfig mal überprüft?

Poste doch mal bitte Deine Project-File, die "qmake -project" erstellt hat. Achte darauf, dass

TEMPLATE = app

eingetragen ist. Falls dies nicht der Fall ist, dann die Zeile nachträglich hinzufügen und nochmal qmake aufrufen.

Gruß

Mike
orca
Beiträge: 5
Registriert: 5. September 2004 17:32

Beitrag von orca »

hallo nochmal,

mittlerweile habe ich mir das project-file angeschaut, zumindestens ist dort
TEMPLATE=app eingetragen. Nun habe ich schritt für schritt die optionen beim
linken heraugenommen und das ergebnis war das folgende:

kompilieren von hand:
g++ -c -I${QTDIR}/include main.cpp

linken von hand:
g++ -o qt main.o -L/${QTDIR}/lib/ -lqt

dann wurde das programm problemlos übersetzt.
mit qmake erhielt ich folgendes Projektfile qt.pro:

######################################################################
# Automatically generated by qmake (1.07a) Tue Sep 7 23:10:14 2004
######################################################################

TEMPLATE = app
CONFIG -= moc
INCLUDEPATH += .

# Input
SOURCES += main.cpp

nun habe ich mich in der qtconfig umgeschaut, in der mein library path
wie folgt gesetzt sind:
/usr/lib/
/opt/kde3/lib/kde3/plugins/
/home/andre/.kde3/lib/kde3/plugins/
/opt/kde3/lib64/kde3/plugins/
/usr/lib/qt3//plugins mit 2 slashes ????
/usr/lib/qt3/bin

naiv wie ich bin habe ich diese zunächst um alle pfade ergänzt, die
ich von hand benutzt habe, leider interessierte das qmake nicht.
das einzige was mit in meiner unwissenheit auffiel war die tatsache, dass
die option -lqt, ohne die ich mein file nicht kompileren konnte, nicht im von qmake erstellen Makefile enthalten ist. Könnte dies irgendeine bedeutung haben? (frage nebenbei, wo kann man nachschlagen, was optionen wie
-lqt, -Xext genau bedeuten?)

auch wenn das lgs überüllt wirkt, hier ist noch der makefile, könnt ihr damit
etwas mehr anfangen?

generiertes Makefile:
#############################################################################
# Makefile for building: qt
# Generated by qmake (1.07a) (Qt 3.3.1) on: Tue Sep 7 23:10:18 2004
# Project: qt.pro
# Template: app
# Command: $(QMAKE) -o Makefile qt.pro
#############################################################################

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

CC = gcc
CXX = g++
LEX = flex
YACC = yacc
CFLAGS = -pipe -O2 -march=i586 -mcpu=i686 -fmessage-length=0 -Wall -fPIC -Wall -W -O2 -march=i586 -mcpu=i686 -fmessage-length=0 -Wall
-fPIC -DQT_NO_DEBUG
CXXFLAGS = -pipe -O2 -march=i586 -mcpu=i686 -fmessage-length=0 -Wall -fPIC -Wall -W -O2 -march=i586 -mcpu=i686 -fmessage-length=0 -Wall
-fPIC -DQT_NO_DEBUG
LEXFLAGS =
YACCFLAGS= -d
INCPATH = -I/usr/lib/qt3/mkspecs/default -I. -I. -I/usr/include -I$(QTDIR)/include
LINK = g++
LFLAGS =
LIBS = $(SUBLIBS) -L/usr/lib/ -L/usr/X11R6/lib/ -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
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 =
SOURCES = main.cpp
OBJECTS = main.o
FORMS =
UICDECLS =
UICIMPLS =
SRCMOC =
OBJMOC =
DIST = qt.pro
QMAKE_TARGET = qt
DESTDIR =
TARGET = qt

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) $(OBJCOMP) $(LIBS)

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

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

Makefile: qt.pro /usr/lib/qt3/mkspecs/default/qmake.conf
$(QMAKE) -o Makefile qt.pro
qmake:
@$(QMAKE) -o Makefile qt.pro

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

mocclean:

uiclean:

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


####### Sub-libraries

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


FORCE:

####### Compile

main.o: main.cpp

####### Install

install:

uninstall:

vielen dank für eure geduld und schöne grüße
orca
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

So wie es aussieht, fehlt bei dir die Datei qmake.conf . Sie muss in $QTDIR/mkspecs/linux-g++ liegen und Informationen wie QMAKE_LIBDIR_QT , QMAKE_LIBS_QT oder QMAKE_LIBS_QT_THREAD beinhalten. Ist dies nicht der Fall, nimmt qmake diese Pfade nicht mit auf. Da du allerdings (so wie es aussieht) einen AMD64 hast, muss der Pfad wohl $QTDIR/mkspecs/linux-g++-64 heissen.
Wenn das alles passt, setze mal die Umgebungsvariable QMAKESPEC auf "linux-g++-64" und führe qmake nochmals aus.

-lqt bedeutet, dass er die Bibliothek libqt.so beim Linken mit benutzen soll.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
orca
Beiträge: 5
Registriert: 5. September 2004 17:32

Beitrag von orca »

Hallo Christian,

danke für deine hilfe. im mkspecs habe ich mich umgeschaut, default war auf linux-g++ gelinkt (habe ein centrino-NB), und die qmake.conf existiert in diesem verzeichnis (in der datei scheinen auch die wichtigsten variablen gesetzt zu sein), ich habe aber festgestellt, dass die QMAKESPEC-Variable nicht existierte. daher hatte ich sie mit export QMAKESPEC=linux-g++ gesetzt, was aber keine veränderung verursacht hat. komischerweise kennt das makefile das mkspec-verzeichnis beim kompilieren:
g++ -c -pipe -O2 -march=i586 -mcpu=i686 -fmessage-length=0 -Wall -fPIC -Wall -W -O2 -march=i586 -mcpu=i686 -fmessage-
length=0 -Wall -fPIC -DQT_NO_DEBUG -I/usr/lib/qt3/mkspecs/linux-g++ -I. -I. -I/usr/include -I/usr/lib/qt3/include -o main.o main.cpp
aber es linkt nicht gegen die qt-library:
g++ -o qt main.o -L/usr/lib/ -L/usr/X11R6/lib/ -lXext -lX11 -lm
ehrlich gesagt bin ich mit meinem latein am ende, es muss doch möglich sein,
qmake so zu konfigurieren, dass das Makefile im link-befehl noch die flags
-L$(QTDIR)/lib/ -lqt anhängt, oder?

viele grüße, orca
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Sehr komisch das ganze... habe mir den qmake-sourcecode nochmal angeschaut und finde keinen Weg wie es zu diesen Problem kommen könnte. Das einzigste was mir jetzt noch einfällt um das Problem einzugrenzen sind diese 2 Kommandozeilenparameter von qmake:
"-nocache" - ein evtl. vorhandenes cache-file (das evtl. falsche infos hat) nicht benutzen
"-Wall" - ein paar Warnungen ausgeben um evtl. mehr Informationen zu bekommen.

Eventuell kannst Du auch mal probieren, deine qmake.conf zu editieren (aber alte sichern!) Hinter "QMAKE_LIBS = " noch "-L$(QTDIR)/lib -lqt" einfügen und hinter "QMAKE_LIBS_THREAD = -lpthread" zusätzlich "-L$(QTDIR)/lib -lqt-mt". Danach sollten diese Parameter auch im Makefile auftauchen.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
orca
Beiträge: 5
Registriert: 5. September 2004 17:32

Beitrag von orca »

:D Hallo christian,

dein 2. vorschlag funktioniert bestens, zumindestens wird das "hello world" programm ohne probleme kompiliert und gelinkt!
warum das vorher nicht funktioniert hat, hmmh, das werde ich versuchen herauszufinden, wenn ich ein wenig mehr zeit habe. (man verzettelt sich ja so schnell).
vielen dank !!!
orca
Antworten