Qt

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:

  1. QT statisch konfigurieren mit dem Aufruf
    %QTDIR%./configure -static
    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“
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

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

-mh

Hallo Ilona,

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 :frowning:

Hallo Ilona,

wenn libGLU.so oder ein entspr. Link im Verzeichnis
/usr/lib liegt und es eine Linkeroption -L/usr/lib gibt sollte nichts mehr schiefgehen.

Vielleicht nochmal kontrollieren ob in der Kommandozeile wirklich
alles richtig ausgegeben wird.

ld […] -L/usr/lib -lGLU file1.obj file2.obj […]

mehr fällt mir nicht ein:
leider ist meine Linux-Entwicklungszeit doch schon etwas her.

Grüße Lutz

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.

Hallo Ilona,

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:

  1. QT statisch konfigurieren mit dem Aufruf
    %QTDIR%./configure -static
    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“
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

Auf diese Frage weiß ich leider keine Antwort.

Hallo,

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.

Siehe
http://doc.trolltech.com/4.1/deployment-windows.html

Liebe Ilona

Ui, ich muss definitiv mein Profil hier anpassen… mit QT arbeite ich seit Jahren nicht mehr. Sorry :frowning:

Liebe Grüsse

Martin

Hoi Ilona

Lieder arbeite ich seit jahren nicht mehr mit QT - deshalb kann ich Dir die Frage nicht beantworten. Werde wohl drigend mein Profil updaten müssen :wink:

Viel Erfolg und beste Grüsse

Martin

Hallo Ilona,

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.

Gruß,
Kurt

Hallo,

Ich hatte das folgendermassen gelöst:

./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 hoffe es hilft.
Gruß
Karl-Heinz

Ach nochwas, das eben war für qt336.
Jetzt für qt415:

cd qt-x11-commercial-src-4.1.5
./configure -platform linux-g++ -shared -release -no-nis -no-cups -no-sm -no-xshape -no-xinerama -no-xcursor -no-xrandr -no-xrender -no-tablet -no-stl -qt-zlib -qt-libpng -qt-libmng -qt-libjpeg -fast -prefix /testdir/qt415
make make_default
make install

./configure -platform linux-g++ -static -release -no-nis -no-cups -no-sm -no-xshape -no-xinerama -no-xcursor -no-xrandr -no-xrender -no-tablet -no-stl -qt-zlib -qt-libpng -qt-libmng -qt-libjpeg -fast -prefix /testdir/qt415
make make_default
cp -f lib/*.a /testdir/qt415/lib/
cp -f -R plugins /testdir/qt415/

Gruß
Karl-Heinz

Hallo,

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&amp: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):frowning:.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’:

Gruss
Ilona

Hallo,

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

Gruß
Karl-Heinz

Hallo,

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

export QTDIR=/testdir/qt-x11-commercial-src-4.3.0-snapshot-20070218
export PATH=$QTDIR/bin:blush:PATH
export SHLIB_PATH=$QTDIR/lib:blush:SHLIB_PATH
./configure -platform linux-g++ -shared -release -no-nis -no-cups -no-sm -no-xshape -no-xinerama -no-xcursor -no-xrandr -no-xrender -no-tablet -no-stl -qt-zlib -qt-libpng -qt-libmng -qt-libjpeg -fast -prefix /testdir/qt430
make make_default
make install
./configure -platform linux-g++ -static -release -no-nis -no-cups -no-sm -no-xshape -no-xinerama -no-xcursor -no-xrandr -no-xrender -no-tablet -no-stl -qt-zlib -qt-libpng -qt-libmng -qt-libjpeg -fast -prefix /testdir/qt430
make make_default
cp -f lib/*.a /testdir/qt430/lib/
cp -f -R plugins /testdir/qt430/

Danach steht alles was man so braucht in /testdir/qt430/.
Das habe ich mir nach /usr/local/qt gelinkt und in mein .profile folgendes eingefügt:

export PATH=$PATH:/usr/local/qt/bin
export QTDIR=/usr/local/qt

Gruß
Karl-Heinz

Hallo,

  1. unter suse linux 10.1 habe ich’s nicht geschafft,
  2. unter suse linux 10.2 habe ich’s nicht geschafft,
  3. unter suse linux 11.1 habe ich’s auf Anhieb
    statisch kompilieren können!!!

Anscheinend ist QT 4.5.3. von neueren libs abhängig, die
auf alten Systemen nicht vorhanden sind…

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

Gruß T.

Hallo Ilona

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.

VlG BN

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:

  1. die Anwendung ist jetzt 1 MB gross statt 166 KB
  2. 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!
  3. warum werden die libs nicht in meine Anwendung
    gelinkt? Hast Du eine Idee?