Hallo,
kennt sich jemand mit Qt aus? Ich habe auf Mac das Qt SDK installiert.
Nun möchte ich meine Projekte statisch linken. Daszu gibt es eine
Anleitung:
http://doc.trolltech.com/4.6/deployment-mac.html.
Das Problem ist, dass unter Mac nicht die Sourcecodes mit installiert
werden. Also habe ich mir mal die Spurces einzeln geladen und auf dem
Desktop in dem Ordner
./configure -static
make sub-src
ausgeführt. Was muss ich jetzt noch tun, um statisch linken zu können?
Reicht es, die statischen Librarys, die ich jetzt neu erstellt habe nach
/usr/lib zu kopieren? Oder muss ich noch mehr kopieren?
Viele Grüße
Max schrieb:
> Hallo,> kennt sich jemand mit Qt aus? Ich habe auf Mac das Qt SDK installiert.> Nun möchte ich meine Projekte statisch linken. Daszu gibt es eine> Anleitung:> http://doc.trolltech.com/4.6/deployment-mac.html.>> Das Problem ist, dass unter Mac nicht die Sourcecodes mit installiert> werden.> Also habe ich mir mal die Spurces einzeln geladen und auf dem> Desktop in dem Ordner>> ./configure -static> make sub-src>> ausgeführt. Was muss ich jetzt noch tun, um statisch linken zu können?> Reicht es, die statischen Librarys, die ich jetzt neu erstellt habe nach> /usr/lib zu kopieren? Oder muss ich noch mehr kopieren?
Am besten kopierst du gar nichts, sondern installierst Qt. Wenn du sie
nicht ins per default verwendete Zielverzeichnis installieren willst,
dann mach nochmal ./configure mit zusätzlichem -prefix /dein/zielpfad
und ein make (müßte schnell gehen, weil er dazu nicht alles nochmal neu
bauen muß) und danach ein make install.
Dann erzeugst du für dein Projekt das Makefile nicht mit qmake, sondern
mit /dein/zielpfad/bin/qmake. Das setzt dann alle anderen Pfade richtig
für die Verwendung einer selbstgebauten Qt.
Naja ich habe Qt ja schon installiert, also die Binaries. Das
funktioniert ja auch alles tadellos. Zum entwickeln nehme ich Qt
Creator. Nur wollte ich eben statisch linken. Dazu habe ich mir jetzt
die Sources geladen und in dem Verzeichnis, in das ich sie geladen habe
das oben beschriebene ausgeführt. Hat das da schon etwas installiert?
Also in dem Verzeichnis auf meinem Desktop hat es anscheinend die Libs
erstellt.
Max schrieb:
> Ja klar aber dazu muss man erst einmal die Qt Lib statisch compilieren.
Genau. Spaß macht's nicht, aber muss halt sein wenn ich micht recht
entsinne.
Das Problem ist ja eben, dass es wie in der Anleitung bei Mac keinen
Pfad gibt, wo u.a. configure ist. Also dachte ich mir ich lade mal die
Sourcecodes und probiere es damit. Nur jetzt habe ich auf dem Desktop
einen Ordner mit dem Sourcecode und den static compilierten Libs. Nur
damit kann ich ja jetzt auch noch nichts anfangen.
Max schrieb:
> Naja ich habe Qt ja schon installiert, also die Binaries. Das> funktioniert ja auch alles tadellos. Zum entwickeln nehme ich Qt> Creator. Nur wollte ich eben statisch linken. Dazu habe ich mir jetzt> die Sources geladen und in dem Verzeichnis, in das ich sie geladen habe> das oben beschriebene ausgeführt. Hat das da schon etwas installiert?
Wie wäre es, wenn du mein Posting liest, und zwar komplett?
Installieren kannst du, wie oben beschrieben, mit make install, und
dabei wird es, wie oben beschrieben, in das Verzeichnis installiert, das
du beim configure mit -prefix gewählt hast.
Max schrieb:
> Ja klar aber dazu muss man erst einmal die Qt Lib statisch compilieren.
Ach so, jetzt kapiere ich es (auch endlich mal). ;-)
Laut
http://qtnode.net/wiki/Building_static
würde ich sagen nein, den du führst ja nur ein make aus und kein
make install. Und der Satz
> It is advisable to create a separate directory for your static Qt> setup. For instance if you have a C:\qt\4.1.1\ directory which holds> your standard dynamic Qt libs, you might want to create a directory> called C:\qt\4.1.1-static.
liest sich auch so, dass du jetzt noch die Libs selbst verschieben
kannst eher sogar musst. ;-)
Max schrieb:
> Das Problem ist ja eben, dass es wie in der Anleitung bei Mac keinen> Pfad gibt, wo u.a. configure ist.
Unter Linux ist configure ein Skript was du ausführst.
1
./configure-static<otherparameters>
an dem ./ erkennst du, dass das ein Programm oder Skript im aktuellen
Ordner sein muss. ;-)
Darum musst du ja laut Anleitung mit dem Befehl
1
cd/path/to/Qt
in das Verzeichnis wechseln, wo das configure sich befindet.
Habe ich noch nie gemacht, erzähl dann mal ob und wie es geht. ;-)
Wie lang kompiliert man da so an einer Qt-Lib eigentlich?
Also der Pfad ist im Moment auf dem Desktop. Da habe ich auch das make
sub-src ausgeführt nach configure. Aber wieso sollte ich es mit make
install nochmal installieren, wenn ich es schon über den Installer
installiert habe?
Max schrieb:
> Also der Pfad ist im Moment auf dem Desktop. Da habe ich auch das make> sub-src ausgeführt nach configure. Aber wieso sollte ich es mit make> install nochmal installieren, wenn ich es schon über den Installer> installiert habe?
Was für ein Installer? Und wenn du es schon installiert hast, wieso
willst du es dann danach nochmal wo anders hinkopieren?
Max schrieb:
> Also der Pfad ist im Moment auf dem Desktop. Da habe ich auch das make> sub-src ausgeführt nach configure. Aber wieso sollte ich es mit make> install nochmal installieren, wenn ich es schon über den Installer> installiert habe?
Oh man, von klarer Problembeschreibung kann hier aber nicht die Rede
sein...
-Also, lief configure doch bei dir?
-/make sub-src/ lief fehlerfrei durch?
-In der Anleitung (von dir) steht ja, dass du die von dir kompilierte
Bibliothek irgendwohin verschieben kannst/sollst.
Also nochmal ich habe http://qt.nokia.com/downloads/sdk-mac-os-cpp
installiert. Dieser Installer installiert KEINE sources mit, auf die ich
configure etc. anwenden kann.
Deshalb habe ich mir ncoh extr die Sourcecodes separat geladen, und auf
den Desktop kopiert. Dorrt configure und make sub-src gemacht. Jetzt
habe ich auf dem Desktop in nem Ordner die static Libs. Und einfach o
nach /usr/lib kopieren soll auch nicht sehr sauber sein, habe ich
gelesen.
Max schrieb:
> Deshalb habe ich mir ncoh extr die Sourcecodes separat geladen, und auf> den Desktop kopiert. Dorrt configure und make sub-src gemacht. Jetzt> habe ich auf dem Desktop in nem Ordner die static Libs. Und einfach o> nach /usr/lib kopieren soll auch nicht sehr sauber sein, habe ich> gelesen.
Was ist denn jetzt so schwer daran, nach ./configure && make noch ein
make install hinterherzuschieben, dass Dir die Bibliotheken
möglicherweise nicht nur in das Zielverzeichnis verschiebt, sondern
noch zig tausend andere Sachen mit den .a's und .so's macht, damit sie
dann auch benutzbar sind?!?
(Gut, bei statischen Libraries passiert da meist nicht mehr als ein
simples cp und gelegentlich auch noch das ein- oder andere mkdir oder
ln, bei dynamischen Libraries ist das aber schon was anderes.)
Im übrigen ist der gesamte Prozess "wie man Qt aus den Sourcen baut" gut
dokumentiert und es sei Dir ans Herz gelegt, diese Dokumentation zu
lesen und Dich an die dort vorgeschlagenen Schritte zu halten.
Stephan
Max,
es gab seinerzeit eine App-Note bei Apple (nicht Qt/Trolltech/jetzt
Nokia), die vom statischen Linken abrät. Warum MUß es unbedingt statisch
sein? Das beste Beispiel, daß man sich statischem Linken ins Bein
schießen kann, ist Perl. Apple hat es zumindest bis Leo nicht geschafft,
dieses komplett dynamisch zu linken. Damit sind gegen libperl gelinkte
Applikationen teilweise nicht zwischen den MacOS-Versionen portabel.
Es gibt zwei Möglichkeiten, eine Lib dynamisch zu erstellen: entweder im
klassischen Unix-Format als dynamische Library (Endung ".dylib", analog
zu ".so" unter Linux), oder als sog. Framework. Letzteres ist nichts
anderes als eine Verzeichnisstruktur mit entsprechenden Libraries,
allerdings betrachtet MacOS das Verzeichnis als eine art Spezialdatei
(vergleichbar zu einer Applikation, welche auch nichts anderes als eine
Verzeichnisstruktur darstellt).
Wenn Du nun Qt unbedingt an Deine App koppeln möchtest, so wäre mein
Vorschlag, Qt als Framework-Bundle innerhalb des Application-Bundles zu
integrieren. Dafür müßte es sogar gehen, das offizielle Binary zu
verwenden.
Man kann auch die .dylibs direkt in einem App-Bundle integrieren, dann
müßtest Du Qt aber tatsächlich neu kompilieren und nachträglich
entsprechende Pfade sowohl innerhalb der Applikation als auch innerhalb
der dylib mit "install_name_tool" bearbeiten.
Dafür gab es eine Dev-Note von Trolltech:
http://doc.trolltech.com/qq/qq09-mac-deployment.html
Viel Erfolg!
Ups, sorry, hab nicht gesehen, daß Dein Link zur 4.6er-Doku mehr oder
weniger das gleiche aussagt. (Immerhin haben sie es mittlerweile in die
Qt-Doku komplett integriert.)
Max schrieb:
> Also nochmal ich habe http://qt.nokia.com/downloads/sdk-mac-os-cpp> installiert. Dieser Installer installiert KEINE sources mit, auf die ich> configure etc. anwenden kann.
Das war soweit schon klar.
> Deshalb habe ich mir ncoh extr die Sourcecodes separat geladen, und auf> den Desktop kopiert. Dorrt configure und make sub-src gemacht. Jetzt> habe ich auf dem Desktop in nem Ordner die static Libs.
Auch klar. Aber oben hast du gesschrieben, daß du die aus den Sourcen
compilierte auch schon mit irgendeinem installer installiert hättest und
jetzt noch irgendwo kopieren willst.
> Und einfach o nach /usr/lib kopieren soll auch nicht sehr sauber sein,> habe ich gelesen.
Deshalb sollst du sie ja auch installieren mit 'make install'.
Max schrieb:
> also nach configure und make sub-src noch ein make install? Aber vorher> das alte nciht deinstallieren, oder?
Jein.
Zumindest bis Version 3.x war es möglich, inplace zu kompilieren. Man
mußte danach im Environment QTDIR auf das entsprechende Verzeichnis
setzen, $QTDIR/bin zum PATH hinzufügen und ggf. $QTDIR/lib zu
DYLD_LIBRARY_PATH. In so einem Fall war kein make install nötig, sofern
man bei configure das entsprechende Verzeichnis auch als -prefix
angegeben hat. Ich meine, zumindest in den ersten Versionen von Qt4 war
das auch möglich. Sofern Du Deinen Code dann auch übers Terminal
kompilierst, müßte es auch ohne Deinstallation der anderen Lib gehen. Ob
die Integration in Xcode dann immer noch klappt, weiß ich leider nicht.
Rolf Magnus schrieb:
>> Und einfach o nach /usr/lib kopieren soll auch nicht sehr sauber sein,>> habe ich gelesen.> Deshalb sollst du sie ja auch installieren mit 'make install'.
In seinem Link steht was anderes.
Linking the Application to the Static Version of Qt> The linker will always choose dynamic over static. There are two> solutions: Either move your Qt dynamic libraries (.dylibs) away to> another directory while you link the application and then move them> back, or edit the Makefile and replace link lines for the Qt libraries> with the absolute path to the static libraries. For example, replace>> -lQtGui>> with>> /where/static/qt/lib/is/libQtGui.a
Max schrieb:
> also nach configure und make sub-src noch ein make install? Aber vorher> das alte nciht deinstallieren, oder?
Steht alles in deinem Link. Ich würde die dynamischen Qt-Libs behalten
und so linken, wie es angegeben ist. (Siehe auch 5 -10 Zeilen weiter
oben.)
Max schrieb:
> Ja aber dazu muss sie ja erst erstmals statisch compiliert werden, und> dass ist es nur auf dem Desktop.
Entweder kapiere ich nicht wie Mac OS X funktioniert, oder du
verschiebst den Krempel einfach vom Desktop dahin, wo du es hin haben
willst.
Oder meinst du. dass das Kompilieren von Qt als statische Libs nur auf
dem Desktop funktioniert?
Oder meinst du. dass das Kompilieren der statischen gelinkten Anwenungen
nur auf dem Desktop funktioniert?
Zu QCreator: Keine Ahnung.
Max schrieb:
> Naja ich weiß eben nciht, wo es hin muss. Das ist ja das Problem. Ich> glaube ich installiere das ganze einfach mal komplett aus den> Sourcecodes.
Brauchst du nicht, die Beantwortung meiner Fragen wäre schon mal ein
Ansatz.
Ich habe nämlich das Gefühl, das wir dir erklären wollen, wie du den
Qt-Quellcode zu einer statischen Lib kompilierst und du versuchst mit
der bereits fertigen statischen Qt-Lib eine Anwendung zu kompilieren.
Das mit dem QCreator dürften wir auch noch hinkriegen...
Beim ersten (leicht müden) Blick,
-Extras
-Einstellungen
-Qt4
da kannst du mal rumprobieren...
Link zu schrieb:
> Das mit dem QCreator dürften wir auch noch hinkriegen...> Beim ersten (leicht müden) Blick,> -Extras> -Einstellungen> -Qt4> da kannst du mal rumprobieren...
Anscheinend musst du da nur zum richtigen qmake gehen, den Rest
kapiert QtCreator so. So richtig test kann ich es natürlich nicht, da
ich ja keine statische selbstkompilierte Qt-Version hier habe, auch
nicht auf dem Desktop. ;-)
Apropos, wie lange hast du denn kompiliert?
Also die Lib hat es erstellt auf dem Desktop in einem Ordner da habe ich
jetzt so was:
.../Desktop/qt-everywhere-opensource-src-4.6.2/lib/libQtCore.a
Also die Lib ist da.
Das mit Qt Creator werde ich probieren.
Also funktionieren tut es mit der neuen Version noch nicht. Beim
compliieren kommt
Es ist keine gültige Qt-Version gesetzt. Setzen Sie sie unter
Einstellungen
Fehler beim Erstellen des Projekts Test
Beim Ausführen des Build-Schritts 'QMake'
Erstellen abgebrochen.
Und in den Einstellungen steht:
... ist nicht installiert führen sie make install aus.
Wenn ich make install mache in dem auf dem Desktop wohin installiert das
dann? In dem Verzeichnis auf dem Desktop? Oder irgendwohin nach usr...
Max schrieb:
> Wenn ich make install mache in dem auf dem Desktop wohin installiert das> dann? In dem Verzeichnis auf dem Desktop? Oder irgendwohin nach usr...
In das Verzeichnis, das dir configure als prefix ausgegeben hat. Wenn du
ihm ein -prefix als Kommandozeilenparameter angegeben hast, dann dahin.
Und damit sind wir wieder bei meiner ersten Antwort angekommen.
Max schrieb:
> Ja ich weiß ja eben nur nicht, ob sich das mit der Vorhandenen Version> verträgt.
Deshalb ja das -prefix! Damit kannst du das an eine selbst ausgewählte
Stelle installieren, ohne daß das der anderen Qt in irgendeiner Weise in
die Quere kommen würde.
Du kannst dir, wenn du willst, 20 verschiedene Qt-Versionen
installieren, und wenn die in 20 verschiedenen Verzeichnissen
installiert sind, merken die nichts von einander. Um dein Programm mit
der gewünschten Qt zu compilieren, mußt du dann nur dafür sorgen, daß
das qmake von dieser Qt verwendet wird, um das Makefile zu generieren.
Gut ich habe jetzt trotzdem mal das make neu laufen lassen, auf die
sources nach configure -static da kommt das:
collect2: ld returned 1 exit status
make[4]: *** [../../../../bin/Assistant.app/Contents/MacOS/Assistant]
Error 1
make[3]: *** [sub-assistant-make_default-ordered] Error 2
make[2]: *** [sub-tools-make_default-ordered] Error 2
make[1]: *** [sub-assistant-make_default-ordered] Error 2
make: *** [sub-tools-make_default-ordered] Error 2
Gut das soll irgendwas mit Webkit und Sql zu tun haben, also probiere
ich jetzt mal das:
sudo ./configure -static -no-webkit -no-sql-sqlite -no-sql-sqlite2
-no-sql-sqlite_symbian
sudo? Wieso führst du configure als root aus?
Die Fehlermeldung ist etwas seltsam, da sie leider überhaupt keinen
Hinweis darauf enthält, wo der Fehler herkommt.
Also der Fehler scheint ein Bug von Qt zu sein. Irgendetwas wird da
mehrmals definiert oder so.
Ich habe jetzt zuerst einmal Qt dynamisch aus dem Verzeichnis auf dem
Desktop ins Standard Verzeichnis installiert. Nun würde ich noch mit
./configure -static und make sub-src die statische lib installieren,
damit ich mit CONFIG += static statisch linken kann.
Wie sind jetzt genau die Schritte dafür? Muss ich zuerst das configure
oder so bereinigen? Irgend etwas stand da glaube ich da, wenn man etwas
ändert, das man da vor den neu konfigurieren bereinigen soll?
Also erst bereinigen (welche Befehl?)
./configure -static...
make sub-src
make install
ist das so korrekt?
Also ich würde es vermeiden, die beiden Qts irgendwie übereinander zu
installieren. Warum installierst du deine statische Qt nicht einfach an
eine andere Stelle und benutzt sie dann von dort? Das hab ich schon
mehrfach vorgeschlagen, aber du bist nicht darauf eingegangen.