qt statisch linken

@

@->-

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
 
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.
 
Zuletzt bearbeitet:
'-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.
 
@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. .)
 
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......

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
 
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.
 
Zuletzt bearbeitet:
oder man hat die Bibliotheken dynamisch und bindet sie ein.
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).
 
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.
 
Zuletzt bearbeitet:
oder das Programm statifier verwenden - habs mal unter ner neuen Suse probiert,
da hats funktioniert
 
Nein,
habs einfach nur mal installiert und probiert - da ist glaub ich
auch Doku dabei.
 
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.

Seltsam eigentlich nicht. Das ist ein Beispiel wie man "plugins" mit "dlfcn.h" und der dazugehörigen lib realisieren kann.
Recht nützlich.
 

Ähnliche Themen

Centos 5.8 ffmpeg und libtheora

Problem mit HSPA+ Modem Huawei E353 - Installation unmöglich?

dovecot und postfix Konfiguration Problem

Firefox 3.5 kompilieren

Displayport + externer Monitor zeigt bei startx nichts erst bei DVI

Zurück
Oben