qt statisch linken

Dieses Thema im Forum "C/C++" wurde erstellt von @->-, 27.01.2009.

  1. @->-

    @->- Guest

    Huhu, ich bin leider kein Profi und muss deshalb mal eine dumme Frage stellen. Ich möchte gerne ein Programm kompillieren welches qt4 verwendet. Dieses Programm soll jetzt auch auf Systemen laufen auf welchen kein qt installiert ist. Also so wie zum Beispiel beim Browser Opera. Mein Problem ist jetzt das ich keine Ahnung habe wie ich dies realisieren kann. Mit Google habe ich leider auch nicht viel gefunden außer das ich die Option -static anscheinend verwenden muss. Ich habe jetzt ein paar Versuche gemacht jedoch alle ohne Erfolg.

    Wie bekomme ich dies nun hin? Hier mal ein auszug aus meiner makefile
    Code:
    ####### Compiler, tools and options
    
    CC            = gcc
    CXX           = g++
    DEFINES       = -DQT_NO_DEBUG -DQT_WEBKIT_LIB -DQT_PHONON_LIB -DQT_SVG_LIB -DQT_SQL_LIB -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_SHARED
    CFLAGS        = -pipe -march=i686 -mtune=generic -O2 -pipe -w -D_REENTRANT $(DEFINES)
    CXXFLAGS      = -pipe -march=i686 -mtune=generic -O2 -pipe -w -D_REENTRANT $(DEFINES)
    INCPATH       = -I/usr/share/qt/mkspecs/linux-g++ -I. -I/usr/include/QtCore -I/usr/include/QtCore -I/usr/include/QtNetwork -I/usr/include/QtNetwork -I/usr/include/QtGui -I/usr/include/QtGui -I/usr/include/QtSql -I/usr/include/QtSql -I/usr/include/QtSvg -I/usr/include/QtSvg -I/usr/include/phonon -I/usr/include/phonon -I/usr/include/QtWebKit -I/usr/include/QtWebKit -I/usr/include -I. -I. -I.
    LINK          = g++
    LFLAGS        = -Wl,-rpath,/usr/lib
    LIBS          = $(SUBLIBS)  -L/usr/lib -lQtWebKit -L/usr/lib -lsqlite3 -L/usr/X11R6/lib -pthread -pthread -pthread -pthread -pthread -pthread -pthread -pthread -pthread -pthread -pthread -pthread -lphonon -lQtSvg -pthread -pthread -pthread -pthread -pthread -pthread -pthread -pthread -lQtSql -pthread -pthread -lQtGui -pthread -lpng -lSM -lICE -pthread -pthread -lXi -lXrender -lXrandr -lXfixes -lXcursor -lXinerama -lfreetype -lfontconfig -lXext -lX11 -lQtNetwork -lssl -lcrypto -pthread -pthread -lQtCore -lz -lm -pthread -lgthread-2.0 -lrt -lglib-2.0 -ldl -lpthread
    AR            = ar cqs
    RANLIB        = 
    QMAKE         = /usr/bin/qmake
    TAR           = tar -cf
    COMPRESS      = gzip -9f
    COPY          = cp -f
    SED           = sed
    COPY_FILE     = $(COPY)
    COPY_DIR      = $(COPY) -r
    INSTALL_FILE  = install -m 644 -p
    INSTALL_DIR   = $(COPY_DIR)
    INSTALL_PROGRAM = install -m 755 -p
    DEL_FILE      = rm -f
    SYMLINK       = ln -sf
    DEL_DIR       = rmdir
    MOVE          = mv -f
    CHK_DIR_EXISTS= test -d
    MKDIR         = mkdir -p
    
    Oder bin ich auf dem Holzweg?

    In diesem Sinne
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 ixs, 27.01.2009
    Zuletzt bearbeitet: 27.01.2009
    ixs

    ixs Foren As

    Dabei seit:
    20.06.2008
    Beiträge:
    95
    Zustimmungen:
    0
    wenn du dein Programm statisch haben willst musst du bei der qt (Quellcode) installation das präfix -static,
    ./configure -static mit verwenden.

    Ansonsten würde ich dir aber eher empfehlen die nötigen Bibs mit ins Programmverzeichnis zu legen.
    [ich schau noch mal nach, sorry dauert ein bisschen]

    Oder am besten extra anzubieten, so mache ich es auch.

    Wird sonnst ziemlich groß, das Programm.
     
  4. rikola

    rikola Foren Gott

    Dabei seit:
    23.08.2005
    Beiträge:
    2.133
    Zustimmungen:
    0
    '-static' ist die Option, die Du dem Compiler (der den Linker aufruft) mitgeben musst, um ein statisches Programm zu erzeugen. Also in Deinem Makefile 'LFLAGS' um '-static' erweitern.

    Was meinst Du mit 'ohne Erfolg': wie macht sich das bemerkbar? Beschreibe doch bitte, was Du versucht hast, und welche Fehlermeldungen es gab, denn prinzipiell ist '-static' genau die Option fuer Dein Problem.
     
  5. ixs

    ixs Foren As

    Dabei seit:
    20.06.2008
    Beiträge:
    95
    Zustimmungen:
    0
    @rikola: funktioniert bei qt leider nicht.

    1. qt Statisch installieren.
    Man benötige viel Platz glaub 20 GB und viel viel Zeit.
    Man kann auch demos und examples löschen und und dafür ne leere .pro einfügen.

    Dann Quellcodepaket nach /usr/local entpacken.
    ins Verzeichnis wechseln.
    ./configure kruetze (zeigt Kompelierungsoptionen an)
    ./configure -static
    make
    make install

    Dann Variablen setzen.
    oder in /etc/ld.so.conf und /etc/profile hinzufügen
    oder ~/.bashrc
    oder einfach böse nach /usr/local/bin und /usr/local/lib kopieren

    und fertig.

    2. mach ich morgen. .)
     
  6. @->-

    @->- Guest

    Ach das ist doch wahnsinn, ich habe beim besten willen keine Motivation qt4 neu zu bauen :) Ich habe jetzt mal die notwendigen Bibiotheken in den Programmordner kopiert und unter einem Ubuntu Livesystem gestartet und siehe da so geht es auch :) das ist dann auch die bessere Lösung würde ich behaupten, ich will ja keine Wissenschaft daraus machen

    In diesem Sinne
     
  7. #6 ixs, 28.01.2009
    Zuletzt bearbeitet: 28.01.2009
    ixs

    ixs Foren As

    Dabei seit:
    20.06.2008
    Beiträge:
    95
    Zustimmungen:
    0
    Glaube aber nicht das er diese verwendet, sondern die aus /usr/lib/.
    Versuch es mal mit einer älteren life ohne kde4.
    Bei Windows dll geht das mit dem Projektordner, bei .so bin ich mir noch nicht so sicher.
    .
    .
    .
    EDIT (autom. Beitragszusammenführung) :
    .

    Code:
    #include <stdio.h>
    #include <stdlib.h>
    #include <myequal.h>
    #include <dlfcn.h>
    #define LIBEQUAL "libequal.so"
    
    /* dynamische Bibliothek laden */
    static void *my_load_dyn (const char *lib) {
      static void *handle;
      handle = dlopen (LIBEQUAL, RTLD_NOW);
      if (handle == NULL) {
        printf ("Fehler bei dlopen(): %s\n", dlerror ());
        exit (EXIT_FAILURE);
      }
      return handle;
    }
    
    /* Funktion aus der dynamischen Bibliothek laden */
    static void *my_load_func (void *handle, const char *func) {
      void *funcptr = dlsym (handle, func);
      if (funcptr == NULL) {
        printf ("Fehler bei dlsym(): %s\n", dlerror ());
        exit (EXIT_FAILURE);
      }
      return funcptr;
    }
    
    /* Speicher wieder freigeben */
    static void my_close_func (void *handle) {
      if (dlclose (handle))
        printf ("Fehler bei dlclose(): %s\n", dlerror ());
    }
    
    int main (void ) {
      MYBOOL ret;
      void *lib_handle;
      int (*equal) (int a, int b);
      int val1=1 ,val2 = 1;
    
      while ( 1 ) {
        printf ("Zahl 1 eingeben: ");
        scanf ("%d", &val1);
        printf ("Zahl 2 eingeben: ");
        scanf ("%d", &val2);
        if( val1 == 0 || val2 ==0 )
          break;
        lib_handle = my_load_dyn (LIBEQUAL);
        equal = my_load_func (lib_handle, "my_equal");
        ret = (*equal) (val1, val2);
        if (ret == MYTRUE)
          printf ("Beide Werte sind gleich\n");
        else
          printf ("Die Wert sind nicht gleich\n");
        my_close_func (lib_handle);
      }
      return EXIT_SUCCESS;
    }
    
    Quelle: Linux-UNIX Programmierung von Jürgen Wolf im Galileo Computing Verlag


    oder man hat die Bibliotheken dynamisch und bindet sie ein.
     
  8. rikola

    rikola Foren Gott

    Dabei seit:
    23.08.2005
    Beiträge:
    2.133
    Zustimmungen:
    0
    Der Code von Dir ist eine aeusserst seltsame Art, eine Bibliothek zu verwenden. Normalerweise deklariert man die Funktion, die man benutzen moechte - meist, indem man die entsprechende header-Datei mittels '#include <...>' mit einschliest. Die Einbindung der Definition der Funktion ueberlaesst man dann dem Linker.

    Uebrigens ist eine Datei mit der Endung 'so' eine dynamische Bibliothek (shared object. Das statische Pendant endet auf 'a' (archive).
     
  9. #8 ixs, 29.01.2009
    Zuletzt bearbeitet: 29.01.2009
    ixs

    ixs Foren As

    Dabei seit:
    20.06.2008
    Beiträge:
    95
    Zustimmungen:
    0
    ups :]


    sonnst weiß ich nicht, wie man ein dynamische Bibliothek mit einbindet.

    ...
    Ich mach hier einen riesen Fehler, da man ja eigentlich dynamische nicht statisch einbindet, da sie sich ja im gegensatz zu statischen schon im cache befinden und nicht beim Programmstart eingebunden werden.
    Glaube da bleibt nur der (unbeliebte) Weg selber statische Qt Bibliotheken zu erstellen.
     
  10. #9 pferdefreund, 02.02.2009
    pferdefreund

    pferdefreund Doppel-As

    Dabei seit:
    26.12.2007
    Beiträge:
    144
    Zustimmungen:
    0
    oder das Programm statifier verwenden - habs mal unter ner neuen Suse probiert,
    da hats funktioniert
     
  11. @->-

    @->- Guest

    Mhh hört sich ganz gut an, aber die Dokumentation ist etwas mager... Hast du evtl. mehr Infos?

    In diesem Sinne
     
  12. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  13. #11 pferdefreund, 03.02.2009
    pferdefreund

    pferdefreund Doppel-As

    Dabei seit:
    26.12.2007
    Beiträge:
    144
    Zustimmungen:
    0
    Nein,
    habs einfach nur mal installiert und probiert - da ist glaub ich
    auch Doku dabei.
     
  14. Krotti

    Krotti Foren As

    Dabei seit:
    01.03.2007
    Beiträge:
    78
    Zustimmungen:
    0
    Seltsam eigentlich nicht. Das ist ein Beispiel wie man "plugins" mit "dlfcn.h" und der dazugehörigen lib realisieren kann.
    Recht nützlich.
     
Thema: qt statisch linken
Besucher kamen mit folgenden Suchen
  1. qt statisch kompilieren

Die Seite wird geladen...

qt statisch linken - Ähnliche Themen

  1. "halbstatisch" linken

    "halbstatisch" linken: Hallo, gibt es eine einfache Moeglichkeit, dem Compiler (g++) mitzuteilen, welche Bibliotheken er statisch und welche er dynamisch verbinden...
  2. Monobibliotheken statisch in ein Projekt hinzulinken

    Monobibliotheken statisch in ein Projekt hinzulinken: Hallo, ich habe eine Client-/Server-Anwendung erstellt, welches .NET 2.0 Remoting verwendet. Der Server ist rein konsolenbasiert und er soll nun...
  3. Artikel: Statische Webseiten mit Pelican erstellen

    Artikel: Statische Webseiten mit Pelican erstellen: Heutzutage werden viele Webseiten im Internet dynamisch generiert, seien es Nachrichten-Seiten, Social Networks oder auch Blogs. Statische...
  4. Kann Raspberry nicht per Lan und statischer IP einbinden

    Kann Raspberry nicht per Lan und statischer IP einbinden: Hallo, ich hatte neulich das IP-Netz meines Heimnetzwerkes geändert (von x.x.178.x auf x.x.10.x). Heute musste ich auf meiner Raspberry (mit...
  5. statische IP an KVM

    statische IP an KVM: Moin zusammen! Ich habe ein CentOS 5.3 bei Hetzner auf einem EQ4 Root-Server laufen. 64-Bit Version. Ich versuche seit einiger Zeit meine VM dort...