Forum: PC-Programmierung FLTK statisch linken


von Tom A. (toma)


Angehängte Dateien:

Lesenswert?

Ich habe unter Ubuntu-Linux ein kleines Testprogramm mit FLTK/Fluid 
geschrieben, womit ich dynamisches/statisches linken teste. Dynamisch 
gelinkt ist es 21 kByte, statisch gelinkt 580,7 kByte groß. Statisch 
dazu gelinkt wird nur die FLTK-Library. Beide Programme funktionieren 
auf meinem PC gleich (Bild OutWin.png die anderen Bilder zeigen die 
Dateigrößen).

Wenn ich mir in der Konsole mit "file QtTest" dessen Eigenschaften 
ansehe steht dort beide male "dynamically linked", was mich etwas 
verunsichert.
----------------
QtTest: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), 
dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, 
BuildID[sha1]=ab966515cfaa015f744d7423b747e04cff3242fe, for GNU/Linux 
3.2.0, with debug_info, not stripped
----------------
Wenn ich in der Konsole mit "ldd QtTest" der statisch gelinkten Version 
die Liste der dynamisch gelinkten Librarys für das Programm ansehe, 
finde ich dort kein FLTK. Dies bedeutet zusammen mit der Dateigröße 
doch, daß FLTK statisch gelinkt ist. In der dynamisch gelinkten Version 
ist FLTK mit aufgeführt.
----------------
  linux-vdso.so.1 (0x00007ffc34b56000)
  libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007c6826b15000)
  libX11.so.6 => /lib/x86_64-linux-gnu/libX11.so.6 (0x00007c68269d5000)
  libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 
(0x00007c6826600000)
  libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 
(0x00007c68269b5000)
  libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007c6826200000)
  /lib64/ld-linux-x86-64.so.2 (0x00007c6826c8b000)
  libxcb.so.1 => /lib/x86_64-linux-gnu/libxcb.so.1 (0x00007c682698b000)
  libXau.so.6 => /lib/x86_64-linux-gnu/libXau.so.6 (0x00007c6826983000)
  libXdmcp.so.6 => /lib/x86_64-linux-gnu/libXdmcp.so.6 
(0x00007c682697b000)
  libbsd.so.0 => /lib/x86_64-linux-gnu/libbsd.so.0 (0x00007c6826963000)
  libmd.so.0 => /lib/x86_64-linux-gnu/libmd.so.0 (0x00007c6826956000)
----------------
Meine Frage: Da ich auf allen meinen Rechnern FLTK installiert habe, wie 
kann ich sicher sein dass das Programm auf Rechnern ohne installiertes 
FLTK läuft?

Gruß. Tom

von Motopick (motopick)


Lesenswert?

Tom A. schrieb:

> Wenn ich mir in der Konsole mit "file QtTest" dessen Eigenschaften
> ansehe steht dort beide male "dynamically linked", was mich etwas
> verunsichert.

Du hast ja nur einen Teil statisch dazugelinkt.
Da bleibt noch genug uebrig. :)

Edith:
> wie
> kann ich sicher sein dass das Programm auf Rechnern ohne installiertes
> FLTK läuft?

Sicher ist das nicht. Wenn naemlich das FLTK nicht (mehr) zu den
uebrigen Bibliotheken passt.

: Bearbeitet durch User
von Tom A. (toma)


Lesenswert?

Konnte das Problem selbst lösen.

Habe eine statisch und eine dynamisch gelinkte Version des Programms 
erstellt und gespeichert. Danach FLTK deinstalliert und jede Version mal 
gestartet. Die dynamische Version läuft nicht mehr, die statische 
Version funktioniert.

Da der PC ein normales Ubuntu Entwicklungssystem, ohne Besonderheiten, 
ist sollte das Programm auf den meisten Linux-PC's laufen. Und falls 
nicht kann man mit "ldd" nachsehen was fehlt.

Jetzt hoffe ich nur, dass ich FLTK wieder installieren kann. Bei 
www.fltk.org ist heute der Wurm drin und sie sind nicht erreichbar.

Tom

von Motopick (motopick)


Lesenswert?

Tom A. schrieb:
> Konnte das Problem selbst lösen.
>
> Habe eine statisch und eine dynamisch gelinkte Version des Programms
> erstellt und gespeichert. Danach FLTK deinstalliert und jede Version mal
> gestartet. Die dynamische Version läuft nicht mehr, die statische
> Version funktioniert.

Umbenennen haette gereicht.

> Da der PC ein normales Ubuntu Entwicklungssystem, ohne Besonderheiten,
> ist sollte das Programm auf den meisten Linux-PC's laufen. Und falls
> nicht kann man mit "ldd" nachsehen was fehlt.

Das ist nur das Prinzip Hoffnung. Oder hast du geprueft welche
externen Referenzen noch von FLTK angezogen werden? Die koennen ja
durchaus in weiteren dynamisch gelinkten Libs liegen...

von Alexander S. (alesi)


Lesenswert?

Tom A. schrieb:
> Jetzt hoffe ich nur, dass ich FLTK wieder installieren kann. Bei
> www.fltk.org ist heute der Wurm drin und sie sind nicht erreichbar.

Normalerweise installiert man doch Pakete für seine Distribution über 
den Paketmanager seiner Distribution. Bei Dir also deb Pakete aus 
Ubuntu. Brauchst Du die aller neueste Version von fltk?

von Εrnst B. (ernst)


Lesenswert?

Tom A. schrieb:
> Jetzt hoffe ich nur, dass ich FLTK wieder installieren kann. Bei
> www.fltk.org ist heute der Wurm drin und sie sind nicht erreichbar.

Wenn das Programm nachher möglichst problemlos auf andere 
Linux-Installationen übertragbar sein soll, wär libfltk-dev / 
libfltk1.3-dev aus den Paketquellen vmtl. besser.

Verhindert Probleme mit:
Motopick schrieb:
> externen Referenzen noch von FLTK angezogen

Und du könntest dynamisch linken, und das dann einfach in ein passendes 
.deb verpacken, was die Abhängigkeiten reinzieht.

von Daniel A. (daniel-a)


Lesenswert?

Normalerweise ist das ganz einfach, wenn man alles statisch linken will. 
Man macht einfach "gcc -s" statt "gcc", fertig. Solange man die Libs mit 
-lirgendnelib angegeben hat, und nicht mit libirgendnelib.so oder 
libirgendnelib.a, nimmt es dann jenachdem ob man -s angegeben hat oder 
nicht die .a oder die .so, und damit geht dann alles out of the box.

Dann kann man noch Optimierungen einschalten (-Os -Wl,--gc-sections 
-ffunction-sections -fdata-sections), dann ist es oft auch gar nicht 
mehr allzu gross.

von Tom A. (toma)


Lesenswert?

Da wurden ja noch einige Tips gegeben, danke euch - werde ich mir 
ansehen.

Da FLTK 1.3.8 nun schon weg war, habe ich die Version 1.4 ausprobiert. 
Dort ist das Problem genau umgekehrt, es wird immer die statische 
Bibliothek gelinkt. Da hat so ein einfaches Programm schnell eine Größe 
von 1MByte. Bin wieder zurück auf 1.3.8.

Ist ja nicht für ein Projekt, sondern zum lernen und ausprobieren.

Tom

von Rolf M. (rmagnus)


Lesenswert?

Daniel A. schrieb:
> Normalerweise ist das ganz einfach, wenn man alles statisch linken will.
> Man macht einfach "gcc -s" statt "gcc", fertig.

Maja, nicht ganz. Man muss schon auch von sämtlichen verwendeten Libs 
eine statische Version installiert haben. Und in manchen Fällen, wie es 
z.B. oft bei openssl gemacht wird, werden dynamische Bibliotheken auch 
zur Laufzeit per dlopen() nachgeladen.

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.