ich möchte eine kleine QT-Anwendung unter Suse Linux 10.3 statisch kompilieren.
Hierzu geht man nach meinen Recherchen folgendermassen vor:
QT statisch konfigurieren mit dem Aufruf
%QTDIR%./configure -static
und
nmake sub-src
in Anwendung.qrc Folgendes hinzufügen:
CONFIG += static
in Makefile.Release den Eintrag setzen
LFLAGS = -static …
Anwendung neu kompilieren
Anwendung sollte keine externen QT-Libraries mehr
benötigen (weil eine grosse Executable erstellt wurde).
Leider funktioniert bei mir die Vorgehensweise nicht.
Grund: beim statischen Linken meiner Anwendung bekomme ich die Fehlermeldung
„ld: cannot find -lGLU“
Ohne ‚LFLAGS = -static‘ wird meine dynamisch gelinkte Executable korrekt erstellt.
Die Datei libGLU.so ist bei mir auf dem Rechner vorhanden und im LIBS-Eintrag in Makefile.Release ist ein korrekter Verweis auf das Verzeichnis -L/usr/lib
angegeben.
(libGLU.so = 11 B)
(libGLU.so.1 = 20 B)
(libGLU.so.1.3.070001 = 484.2 KB)
Wie sollte ich vorgehen, damit meine Applikation unter Suse Linux statisch gelinkt werden kann?
Für einen Hinweis bedanke ich mich im Voraus:
Ilona
Leider kann ich dir nicht behilflich sein, unter Linux und mit MAKE-Files habe ich mit qt noch nicht gearbeitet.
Rein aus dem Bauch heraus vermute ich aber eine fehlende/fehlerhaft Pfad-Angabe. Wenn, wie du schon sagst, die Pfade korrekt sind, bin ich mit meinem Latein am Ende.
leider habe ich nicht viel Ahnung von qt. Habe während meines Studiums damit rum
experementiert, aber nur ein bißchen und unter windows. Ich verstehe gar nicht wieso sie
mich hier als Experten führen. Sorry
Anscheinend wird aber nicht die richtige Datei gefunden.
.so-Dateien sind DYNAMISCHE Bibliotheken, .a-Dateien statische. Du linkst statisch.
Falls du OpenGL nicht benötigst kannst Du ohne OpenGL linken (ohne libQtOpenGL4 oder was auch immer): http://lists.trolltech.com/qt-interest/2001-05/threa…
Falls nicht musst Du dir die richtige libGLU.a besorgen/kompilieren.
leider habe ich noch nie eine QT Anwendung unter Linux
statisch kompiliert, so daß meine Antwort auf
Vermutungen basieren muss.
Vorneweg: Da die Installation von QT unter Linux
generell unproblematisch ist, wäre dynamisches Linken
normal die bessere Variante.
Meine Vermutung ist, daß Du zwar QT statisch kompiliert
hast, die OpenGL Lib libGLU jedoch nicht dafür geeignet
ist. Möglicherweise gibt es hiervon eine statische
Version, ansonsten müsstest Du die Lib selber passend
kompilieren.
Ein einfacher Test wäre das Weglassen der OpenGL
spezifischen Funktionalität der Anwendung und dann ein
erneuter Test ob sich die Anwendung kompilieren (und
portieren) lässt.
Viele Grüße
Wolfgang
Liebe/-r Experte/-in,
ich möchte eine kleine QT-Anwendung unter Suse Linux
10.3
statisch kompilieren.
Hierzu geht man nach meinen Recherchen folgendermassen
vor:
QT statisch konfigurieren mit dem Aufruf
%QTDIR%./configure -static
und
nmake sub-src
in Anwendung.qrc Folgendes hinzufügen:
CONFIG += static
in Makefile.Release den Eintrag setzen
LFLAGS = -static …
Anwendung neu kompilieren
Anwendung sollte keine externen QT-Libraries mehr
benötigen (weil eine grosse Executable erstellt
wurde).
Leider funktioniert bei mir die Vorgehensweise nicht.
Grund: beim statischen Linken meiner Anwendung bekomme
ich die
Fehlermeldung
„ld: cannot find -lGLU“
Ohne ‚LFLAGS = -static‘ wird meine dynamisch gelinkte
Executable korrekt erstellt.
Die Datei libGLU.so ist bei mir auf dem Rechner
vorhanden und
im LIBS-Eintrag in Makefile.Release ist ein korrekter
Verweis
auf das Verzeichnis -L/usr/lib
angegeben.
(libGLU.so = 11 B)
(libGLU.so.1 = 20 B)
(libGLU.so.1.3.070001 = 484.2 KB)
Wie sollte ich vorgehen, damit meine Applikation unter
Suse
Linux statisch gelinkt werden kann?
Für einen Hinweis bedanke ich mich im Voraus:
Ilona
ich habe leider noch keine Anwendung statisch gelinkt.
Aber bei meinen Recherchen habe ich Punkt 2 nicht finden können. In der *.qrc Datei stehen doch nur z.B. Bilder. Wenn dann gehört das doch in die *.pro?
Und das man in dem makefile LFLAGS -static setzen muß habe ich auch nicht gelesen.
mal
nmake clean
qmake -config release
nmake
probiert.
meistens arbeite ich mit Qt unter Windows. Fragen zur Buildumgebung unter Linux kann ich daher nur durch eigenes Experimentieren beantworten. Das kann ich leider erst nach meinem Urlaub (9.-16.10.) machen (keine Zeit). Ich weiß nicht, ob Du so lange warten magst.
./configure -platform linux-g++ -thread -shared -no-sm -no-xshape -no-xinerama -no-xrender -fast -prefix /testdir/qt336
make sub-src
cd src
make staticlib
cd …
cd tools/designer
make sub-uic
cd …
cd …
make qmake-install
make moc-install
make src-install
cp -f lib/* /testdir/qt336/lib/
cp -f bin/* /testdir/qt336/bin/
ich gehe davon aus, dass ich ./configure nur einmal
(mit der Option -static) aufrufen sollte, nicht wahr?
Der Schalter „no-table“ ist bei mir (QT open source
4.5.3) nicht bekannt, so weggelassen.
Jetzt erhalte ich beim Kompilieren meiner Applikation
viele andere Linkerwarnungen und -fehler (Auflistung
ganz unten).
Welche Linux-Version nutzt Du? Hast Du andere Libraries
auf Deinem System installiert?
libX11.a(CrGlCur.o): In function open\_library': (.text+0x3b): warning: Using 'dlopen' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking /opt/qtsdk- 2009.04/qt/lib/libQtCore.a(qfsfileengine\_unix.o): In function QFSFileEngine::owner(QAbstractFileEngine::FileOwner)
const’:
qfsfileengine_unix.cpp:frowning:.text+0x9d0): warning: Using
‚getgrgid_r‘ in statically linked applications requires
at runtime the shared libraries from the glibc version
used for linking
libglib-2.0.a(gutils.o): In function g\_get\_any\_init\_do': (.text+0x14be): warning: Using 'getpwuid' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking libglib-2.0.a(gutils.o): In function g_get_any_init_do’:
(.text+0x14b1): warning: Using ‚setpwent‘ in statically
linked applications requires at runtime the shared
libraries from the glibc version used for linking
libglib-2.0.a(gutils.o): In function g\_get\_any\_init\_do': (.text+0x14c6): warning: Using 'endpwent' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking libX11.a(GetDflt.o): In function GetHomeDir’:
(.text+0xa9): warning: Using ‚getpwnam_r‘ in statically
linked applications requires at runtime the shared
libraries from the glibc version used for linking
/opt/qtsdk-
2009.04/qt/lib/libQtGui.a(qapplication_x11.o): In
function sm\_performSaveYourself(QSessionManagerPrivate\*)': qapplication\_x11.cpp:frowning:.text+0x8619): warning: Using 'getpwuid\_r' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking /opt/qtsdk- 2009.04/qt/lib/libQtNetwork.a(qhostinfo\_unix.o): In function QHostInfoAgent::fromName(QString const&:wink:’:
qhostinfo_unix.cpp:frowning:.text+0x47e): warning: Using
‚getaddrinfo‘ in statically linked applications
requires at runtime the shared libraries from the glibc
version used for linking
libX11.a(imLcIm.o): In function \_XimLocalOpenIM': (.text+0x12f7): warning: memset used with constant zero length parameter; this could be due to transposed parameters libICE.a(icetrans.o): In function _IceTransGetPeerNetworkId’:
(.text+0x4ed5): warning: Using ‚gethostbyaddr‘ in
statically linked applications requires at runtime the
shared libraries from the glibc version used for
linking
libICE.a(icetrans.o): In function \_IceTransSocketUNIXConnect': (.text+0x3d17): warning: Using 'gethostbyname' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking libICE.a(icetrans.o): In function _IceTransSocketINETConnect’:
(.text+0x434a): warning: Using ‚getservbyname‘ in
statically linked applications requires at runtime the
shared libraries from the glibc version used for
linking
libfontconfig.a(fcfreetype.o): In function .L429': (.text+0x271c): undefined reference to FT_Get_BDF_Property’
libfontconfig.a(fcfreetype.o): In function .L429': (.text+0x2755): undefined reference to FT_Get_BDF_Property’
libfontconfig.a(fcfreetype.o): In function .L429': (.text+0x2c6c): undefined reference to FT_Get_BDF_Property’
libfontconfig.a(fcfreetype.o).text+0x2cd8): more
undefined references to FT\_Get\_BDF\_Property' follow libfontconfig.a(fcxml.o): In function FcConfigMessage’:
(.text+0x28b): undefined reference to XML\_GetCurrentLineNumber' libfontconfig.a(fcxml.o): In function FcConfigMessage’:
libfontconfig.a(fcxml.o): In function FcConfigParseAndLoad': (.text+0x21c5): undefined reference to XML_ParserFree’
libfontconfig.a(fcxml.o): In function FcConfigParseAndLoad': (.text+0x24c7): undefined reference to XML_ErrorString’
libX11.a(ClDisplay.o): In function XCloseDisplay': (.text+0xbe): undefined reference to xcb_disconnect’
libX11.a(OpenDis.o): In function OutOfMemory': (.text+0x7ea): undefined reference to xcb_get_setup’
libX11.a(OpenDis.o): In function XOpenDisplay': (.text+0xc31): undefined reference to xcb_get_maximum_request_length’
libX11.a(xcb_lock.o): In function \_XPutXCBBuffer': (.text+0xdd): undefined reference to xcb_get_request_sent’
libX11.a(xcb_lock.o): In function \_XPutXCBBuffer': (.text+0x36e): undefined reference to xcb_send_request’
libX11.a(xcb_lock.o): In function \_XGetXCBBuffer': (.text+0x578): undefined reference to xcb_get_request_sent’
libX11.a(xcb_lock.o): In function `_XGetXCBBuffer’:
Das war auf Linux 9.3, ganz normal installiert.
Deshalb ja auch die ganzen -no-… un dass die QT eigenen libs genommen werden sollen (-qt-zlib -qt-libpng -qt-libmng -qt-libjpeg ).
Hat mir keine Ruhe gelassen, deshalb habe ich das Ganze soeben noch einmal getestet, und zwar mit der
qt-x11-commercial-src-4.3.0-snapshot-20070218, meiner letzten heruntergeladenen Version.
Das System ist ein Lenovo Laptop mit Suse 10.3
Linux laplin 2.6.22.5-31-default #1 SMP 2007/09/21 22:29:00 UTC x86_64 x86_64 x86_64 GNU/Linux
QT statisch konfigurieren mit dem Aufruf
%QTDIR%./configure -static
%VARIABLEN_NAME% sieht mir nach windows aus. unter Unix (Linux) werden Variablen mit einen $ eingeleitet
und
nmake sub-src
2. in Anwendung.qrc Folgendes hinzufügen:
CONFIG += static
3. in Makefile.Release den Eintrag setzen
LFLAGS = -static …
4. Anwendung neu kompilieren
5. Anwendung sollte keine externen QT-Libraries mehr
benötigen (weil eine grosse Executable erstellt wurde).
Leider funktioniert bei mir die Vorgehensweise nicht.
Grund: beim statischen Linken meiner Anwendung bekomme ich die
Fehlermeldung
„ld: cannot find -lGLU“
Wahrscheinlich wird auch versucht GLU statich zu linken.
Instaliere dier auch mal den GLU Quellcode. Das Paket dürfte wahrscheinlich „glu-dev“ heißen.
Deine Fehlermeldung ist der Hinweis,dass es kein libGLU.a gibt.
Du brauchst auch eine libGLU.a.
Um ein tatsächlich statisch gelinktes executable zu bekommen, eher eine statich linkbare Version.
Ich weiß daher ehrlich gesagt nicht, ob es ausreicht, libGLU-devel mit yast nachzuinstallieren.
Wahrscheinlich ist es sinnvoller, libGLU ebenfalls aus den Quellen zu bauen.
qt executable statisch
Ich habe es geschafft, QT 4.5.3. statisch zu
kompilieren (unter Suse Linux 11.1), nachdem ich die
fehlenden *.a-Dateien (devel-packages) nachinstalliert
habe.
Danach habe ich die *.o-Dateien meiner Anwendung
gelöscht und meine executable Anwendung neu kompiliert.
Ergebnis:
die Anwendung ist jetzt 1 MB gross statt 166 KB
die QT-Libraries sind aber leider immer noch nicht
statisch in der Anwendung, sondern werden dynamisch
gesucht (der Befehl ‚ldd‘ bestätigt dies), obwohl
ich den ‚CONFIG += static‘ Eintrag in meiner
.pro-Datei gesetzt habe!
warum werden die libs nicht in meine Anwendung
gelinkt? Hast Du eine Idee?