Forum: PC-Programmierung Qt statisch linken


von Max (Gast)


Lesenswert?

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

von Rolf Magnus (Gast)


Lesenswert?

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.

von Max (Gast)


Lesenswert?

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.

von Link zu (Gast)


Lesenswert?

Steht das nicht in dem von dir angegebenen Link? Zumindest Linking the 
Application to the Static Version of Qt klingt irgendwie danach...

von Max (Gast)


Lesenswert?

Ja klar aber dazu muss man erst einmal die Qt Lib statisch compilieren.

von Mark B. (markbrandis)


Lesenswert?

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.

von Max (Gast)


Lesenswert?

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.

von Rolf Magnus (Gast)


Lesenswert?

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.

von Link zu (Gast)


Lesenswert?

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 <other parameters>
 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?

von Max (Gast)


Lesenswert?

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?

von Rolf Magnus (Gast)


Lesenswert?

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?

von Link zu (Gast)


Lesenswert?

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.

von Max (Gast)


Lesenswert?

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.

von Stephan M. (stephanm)


Lesenswert?

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

von Tom (Gast)


Lesenswert?

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!

von Tom (Gast)


Lesenswert?

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.)

von Rolf Magnus (Gast)


Lesenswert?

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'.

von Max (Gast)


Lesenswert?

also nach configure und make sub-src noch ein make install? Aber vorher 
das alte nciht deinstallieren, oder?

von Tom (Gast)


Lesenswert?

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.

von Link zu (Gast)


Lesenswert?

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.)

von Max (Gast)


Lesenswert?

Ja aber dazu muss sie ja erst erstmals statisch compiliert werden, und 
dass ist es nur auf dem Desktop.

von Max (Gast)


Lesenswert?

Ach das muss ich im Makefile edleren. Aber geht das nciht irgendwie über 
qt Creator direkt? weil ich compiliere damit...

von Link zu (Gast)


Lesenswert?

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.

von Max (Gast)


Lesenswert?

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.

von Link zu (Gast)


Lesenswert?

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...

von Link zu (Gast)


Lesenswert?

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?

von Max (Gast)


Lesenswert?

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.

von Max (Gast)


Lesenswert?

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...

von Rolf Magnus (Gast)


Lesenswert?

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.

von Max (Gast)


Lesenswert?

Ja ich weiß ja eben nur nicht, ob sich das mit der Vorhandenen Version 
verträgt.

von Max (Gast)


Lesenswert?

Ich habe jetzt mal make install gemacht. Am ende kam:

make[4]: *** [../../../../bin/Assistant.app/Contents/MacOS/Assistant] 
Error 1
make[3]: *** [sub-assistant-install_subtargets-ordered] Error 2
make[2]: *** [sub-tools-install_subtargets-ordered] Error 2
make[1]: *** [sub-assistant-install_subtargets-ordered] Error 2
make: *** [sub-tools-install_subtargets-ordered] Error 2

von Rolf Magnus (Gast)


Lesenswert?

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.

von Max (Gast)


Lesenswert?

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

von Max (Gast)


Lesenswert?

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

von Rolf Magnus (Gast)


Lesenswert?

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.

von Max (Gast)


Lesenswert?

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?

von Rolf Magnus (Gast)


Lesenswert?

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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.