Seite 1 von 1

[gelöst] selber moccen mit pkg-config

Verfasst: 31. Dezember 2010 07:33
von OliverKroll
Der normale, "moderne" Weg, ein Qt-Projekt zu übersetzen, ist sicherlich

qmake -project
qmake
make

Letztens war ich in einem Programm am Fehlersuchen, bei dem es wichtig war, welche Biblitheken hinzugefügt wurden.
Leider ist das von qmake erzeugte Makefile zu unübersichtlich, um alle Bibliotheken zu finden.
Deshalb wollte ich ganz altmodisch alle Qt-Dateien mit dem Meta-Object-Compiler übersetzen:

moc mein_programm.cpp -o moc_mein_programm.o
g++ -c moc_mein_programm.cpp -o moc_mein_programm.o `pkg-config Qt --cflags'
g++ main.c moc_mein_programm.o -o projekt1 `pkg-config Qt --libs`

Dabei hat sich gezeigt, daß Qt sich bei pkg-config anders verhält als andere GUI-Bibliotheken. Wenn man im pkg-config nur Qt angibt, wird nichts gefunden. Wenn man QtGui angibt, wird der Include-Pfad richtig gefunden, aber später beim Linken werden nicht alle Referenzen aufgelöst.

Außerdem sind in meinem OpenSuSE 11.3 qt3 und qt4 nebeneinander installiert und es wird vom pkg-config qt3 eingesetzt, ich möchte aber mit qt4 programmieren.
Kann mir jemand sagen, wie man pkg-config in Verbindung mit Qt richtig einsetzt ?

Verfasst: 31. Dezember 2010 08:59
von Christian81
qmake -project wird nur ein eizges Mal aufgerufen. Danach mdofiziert man die pro-Datei - siehe Doku: http://doc.trolltech.com/4.7/qmake-manual.html und besonders http://doc.trolltech.com/4.7/qmake-vari ... .html#libs

Wenn man aber was nahezu automatisches möchte welches z.B. auch auf pkg-config zurückgreift dann ist wohl eher cmake die richtige Wahl.

Verfasst: 31. Dezember 2010 10:08
von OliverKroll
Vielleicht war die Frage schlecht formuliert.

Ich habe mit deinem Link immerhin gefunden http://doc.qt.nokia.com/4.6/moc.html#moc . Unter "Writing Make Rules for Invoking" steht das übliche Beispiel, wie ein Makefile aufgebaut wird:

moc_foo.cpp: foo.h
moc $(DEFINES) $(INCPATH) $< -o $@

Jetzt möchte ich an den Inhalt der Variable INCPATH herankommen.
Normalerweise verwendet man hierfür pkg-config (das aber bei Qt anders als erwartet benutzt wird).

Mir geht es nicht um Automatisierung (weder mit qmake noch mit cmake), sondern während der Fehlersuche (mein Programm bestand aus 10 Dateien, die Bibliothek eines Herstellers bestand aus knapp 100 Dateien) gab es ein Link-Problem: es waren einige Dateien nicht in den Pfaden (INCPATH und LIBS). Das mußte ich jetzt per Hand herausfinden. Konnte ich aber nicht, weil ich dann mit einem Mal nicht mehr an Qt herankam.

Deshalb also noch einmal die Frage: wie komme ich an INCPATH und LIBS von Qt heran (besonders, wenn mehrere Qt-Versionen installiert sind). Normalerweise mit pkg-config, aber bei Qt gibt es da anscheinend Schwierigkeiten.

Verfasst: 31. Dezember 2010 11:16
von OliverKroll
Ich habe vermutlich selber die Antwort gefunden.

Dies scheint die richtige Form zu sein:
moc mywindow.h -o moc_mywindow.cpp
g++ -c moc_mywindow.cpp -o moc_mywindow.o `pkg-config --cflags QtGui QtCore`
g++ main.cpp -c -o main.o
g++ mywindow.cpp -o mywindow.o -c `pkg-config --cflags QtCore QtGui`
g++ mywindow.o moc_mywindow.o main.o -o projekt1 `pkg-config --libs QtCore QtGui`

(bei anderen Bibliotheken heißt es wx-config oder fltk-config; es hätte ja auch ein qt-config geben können)

Durch die Angabe von QtCore und QtGui ist dann wohl auch Qt4 ausgewählt (ich bin mir nicht sicher, aber in Qt3 gab es diese Unterscheidungen wohl noch nicht (QtCore und QtGui)).

Frage beantwortet.