FLTK statisch linken

OP #7728401
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

Angehängte Dateien:
#7728422
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.

OP #7728454
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

#7728523
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...

#7728526
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 im Beitrag #7728523:

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.

#7728728
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.

OP #7728928
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

#7729473
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.

#7736245
Lesenswert?

Ich benutze FLTK schon seit einigen Jahren. Aber der Anfang war sowohl bei Debian als auch bei Ubuntu etwas holperig. Das lag daran, dass beide Distris gegen libfltk.so linken wollen oder aber zu alt sind.

Ich installiere FLTK seit dem immer aus dem Quelltext von der Projektseite. Da wird dann normalerweise der FLTK-Anteil immer statisch eingebunden, die Systembibliotheken jedoch dynamisch. Auf der Projektseite hatte ich damals ein Muster für ein entsprechendes Makefile gefunden.

Das funktionierte bisher immer recht gut. Ich hatte meine Programme bisher immer auf Ubuntu Systemen entwickelt. Einmal hatte ich zu einem Linux-Treffen einen USB-Stick vorbereitet und durfte erstaunt feststellen, dass mein Programm sogar auf einem WeTab lief. Ein anderes Programm lief später, ohne Installation, auch auf Arch Linux. Ich vermute, das dass das gewünschte Verhalten ist.

Ich kann die Installation aus dem Quelltext nur empfehlen, da man da immer aktuell ist und zudem auch viele Beispielprogramme bekommt, aus denen der Sinn einiger Methoden erst ersichtlich wird. Und da ich auch schon mal an einem BugFix mitgearbeitet hatte, kommt für mich sowiso keine andere Variante mehr in Frage.

#7736920
Lesenswert?

Gerade eben habe ich FLTK mal kurz ausprobiert, weil ich es noch nicht kannte. In Ubuntu konnte ich es einfach via Synaptic ohne weiteren Aufwand installieren.
Die Hauptschwierigkeit das "Hello World" ans Laufen zu bringen war statt einfach "gcc hello.cxx" fltk-config zu verwenden:

fltk-config --compile hello.cxx

Eigentlich ist das ganze hier beschrieben:
https://stackoverflow.com/questions/53136185/fltk-box-element-not-visible-in-window

Nun an eine Frage an euch: Kann man mit FLTK einen Graph zur Darstellung von Daten aus dem Mikrocontroller erzeugen?

#7736943
Lesenswert?

Christoph M. schrieb:

Nun an eine Frage an euch: Kann man mit FLTK einen Graph zur Darstellung von Daten aus dem Mikrocontroller erzeugen?

Diese Frage kannst Du herunterbrechen:

Kann man mit FLTK einen Graphen zur Darstellung von Daten erzeugen?

https://www.fltk.org/documentation.php/doc-1.1/Fl_Chart.html (ein willkürliches, mit fünf Sekunden Google-Suche gefundenes Beispiel)

Welchen Unterschied sollte es machen, ob die Daten aus einem Microcontroller, einer Datei oder von sonstwo kommen?

#7736949
Lesenswert?

Harald K.

Kann man mit FLTK einen Graphen zur Darstellung von Daten erzeugen? https://www.fltk.org/documentation.php/doc-1.1/Fl_Chart.html (ein willkürliches, mit fünf Sekunden Google-Suche gefundenes Beispiel)

Tja, heutzutage ist ja "ChatGPT", das ich die letzte halbe Stunde mal verwendet habe. Man kann sich darüber streiten, ob es das wirklich bringt. Im Anhang aber mal ein dynamischer Graph, der mit 100ms Sekunden update läuft.

Zu compilieren mit

fltk-config --compile graphDynamical.cxx

Was jetzt fehlt, ist das Empfangen von Daten über die serielle Schnittstelle.

Angehängte Dateien:
#7737033
Lesenswert?

Der Grund meiner Frage nach dem Graphen war, dass der "Fast Light User-Interface Designer (FLUID)" keine Graph- oder Chartelemente anbietet.

https://www.fltk.org/shots.php

Das ist etwas schade, da Charts- und Graphen nun mal eine wesentliche Komponente technischer User-Interfaces sind.

Ein weiteres Problem ist die Anbindung der seriellen Schnittstelle. Fast alle PC-Guis scheinen ein Problem damit zu haben.

#7737195
Lesenswert?

Ein weiteres Problem ist die Anbindung der seriellen Schnittstelle. Fast alle PC-Guis scheinen ein Problem damit zu haben.

Da ist wohl was dran. Die serielle Schnittstelle brauchte ich bisher nicht, aber dafür das Netzwerk Interface. Bisher hatte ich nur ein Beispiel dafür gefunden und dafür sollte ich boost::asio installieren. Da sollte auch die serielle Schnittstelle enthalten sein. Aber boost scheint es nur komplett zu geben.

Daher habe ich mich dann direkt mit den Linux Systemfunktionen zergnügt, obwohl mir viele davon abgeraten hatten. War sehr lehrreich.

P.s. Mein Eindruck ist, dass allgemein davon ausgegangen wird, man könne nur das verwenden, was FLTK direkt anbietet. Aber man kann alles verwenden, was das System hergibt. Man muss nur Makefile entsprechend einrichten.

OP #7737206
Lesenswert?

Im Bild ein Beispiel eines Linienschreibers für das LIDL PDM300-Multimeter. Es basiert auf dem Beispiel "NTSC Waveform Monitor Sim" von "Erco's FLTK Cheat Page" (https://www.seriss.com/people/erco/fltk/).

Es erhält seine Daten vom Multimeter, mit 3 Messungen je Sekunde, über einen USB/Seriell-Wandler. Benutzt werden für die Übertragung keine FLTK-Methoden, sondern die Funktionen des Betriebssystems.

Leider fehlt mir im Moment die Zeit das Programm fertig zu stellen, da ich mit einem anderen Projekt beschäftigt bin.

Tom

Angehängte Dateien:
#7737324
Lesenswert?

Manfred M.

Beispiel dafür gefunden und dafür sollte ich boost::asio installieren. Da sollte auch die serielle Schnittstelle enthalten sein. Aber boost scheint es nur komplett zu geben.

Das habe ich auch schon versucht zu compilieren. Da scheint aber auch "fltk-config --compile " zu versagen und man muss es wahrscheinlich irgendwie anpassen.

Daher habe ich mich dann direkt mit den Linux Systemfunktionen zergnügt, obwohl mir viele davon abgeraten hatten. War sehr lehrreich.

Hast Du dafür ein kurzes Codebeispiel. Wäre super, vielleicht kann man es einfach anpassen.

Tom A.

Im Bild ein Beispiel eines Linienschreibers für das LIDL PDM300-Multimeter. Es basiert auf dem Beispiel "NTSC Waveform Monitor Sim" von "Erco's FLTK Cheat Page" https://www.seriss.com/people/erco/fltk/ntsc-waveform-sim/ntsc-waveform-sim.cxx.txt

Ich konnte es kompilieren und es sieht ganz nett aus, aber die serielle Schnittstelle fehlt. Hast Du einen Link auf den Linienschreiber?

#7737363
Lesenswert?

Ich weis jetzt nicht wofür du ein Codebeispiel haben willst. Der Netzwerkclient hat ca 1700 Zeilen. Ich könnte zwar die Methode send_request() raus kopieren, aber dann fehlen viele Informationen.

Ich fange mal mit dem Makefile aus meinem aktuellen Projekt an. Da kann man dann sehen, wie man auch so Dinge wie die clib2 einbinden kann (ca. 40 Zeilen habe ich raus gekürzt).

1
CXX      = $(shell fltk-config --cxx)
2
CC       = $(shell fltk-config --cc )
3
DEBUG    = -g
4
CXXFLAGS = $(shell fltk-config  --use-images --cxxflags ) -I.
5
CXXFLAGS += $(shell pkg-config --cflags glib-2.0)
6
LDFLAGS  = $(shell fltk-config  --use-images --ldflags )
7
LDSTATIC = $(shell fltk-config  --use-images --ldstaticflags )
8
LDSTATIC += $(shell pkg-config --libs glib-2.0)
9
LINK     = $(CXX)
10
DEPENDFILE = depend
11

12
PROGDIR    := /usr/local/bin/
13
ICONDIR    := /usr/share/pixmaps/
14
DESKTOPDIR := /usr/share/applications/
15
FILESDIR   := /usr/local/share/vted/
16

17
TARGET = vted
18
OBJS = vted.o\
19
  File_Box.o\
20
  ImageBox_.o\
21
  ...
22
  Unicode_Input.o
23

24
SRCS = vted.cpp\
25
  File_Box.cpp\
26
  ImageBox_.cpp\
27
  ThumbBox.cpp\
28
  ...
29
  Unicode_Input.cpp
30

31
.SUFFIXES: .cpp .o
32
%.o: %.cpp
33
  $(CXX) $(CXXFLAGS) $(DEBUG) -c $<
34

35
.SUFFIXES: .c .o
36
%.o: %.c
37
  $(CC) $(CXXFLAGS) $(DEBUG) -c $<
38

39
$(TARGET): $(OBJS)
40
  $(LINK) -o $(TARGET) $(OBJS) $(LDSTATIC)
41

42

43
depend: $(SRCS)
44
  $(CXX) -MM $(SRCS) > $(DEPENDFILE)
45
-include $(DEPENDFILE)
46

47
install:
48
  install -s $(TARGET) ${PROGDIR}
49
  @cp -u $(TARGET).png ${ICONDIR}
50
  @cp -u $(TARGET).desktop ${DESKTOPDIR}
51
  @mkdir -p $(FILESDIR)
52
  @cp -u frame_mask.png $(FILESDIR)
53
  @cp -u vted_splash.png $(FILESDIR)
54
  @cp -u $(TARGET).cfg $(FILESDIR)
55
#
56
uninstall:
57
  @rm ${DESKTOPDIR}$(TARGET).desktop
58
  @rm ${ICONDIR}$(TARGET).png
59
  @rm ${PROGDIR}$(TARGET)
60
  @rm $(FILESDIR)frame_mask.png
61
  @rm $(FILESDIR)vted_splash.png
62
  @rm $(FILESDIR)$(TARGET).cfg
63
  @rmdir $(FILESDIR)
64

65
clean:
66
  rm -f *.o vted

Die Make Datei habe ich mir im Laufe der Jahre aus verschiedenen Beispielen zusammengebastelt. Da sind auch reine C-Module dabei, deshalb zwei Compiler. Und die Debug Info wird bei

1
install -s

enfernt.

p.s. ich vergaß zu erwähnen, wo bei mir libfltk liegt:

/usr/local/lib/libfltk.a

OP #7737371
Lesenswert?

Hallo Christoph.

Ich habe dir das wesentliche aus dem PDM300-Programm zusammen kopiert. In "Schnittstelle suchen und konfigurieren" wird die durch ihren Namen angegebene Schnittstelle gesucht und mit den aufgeführten Parametern konfiguriert. Default ist ttyACM0 eingestellt, es könnte auch ttyUSB0 oder tty0 oder etwas anderes sein. Welche Schnittstelle du brauchst, musst du für dein System nachsehen und der Initialisierung in "strSio" übergeben.

Da das PDM300 nur sendet ist nur eine Methode "ReadTelex" vorhanden, in der mit der Funktion "iNum = read(SPort, &cDaten[1], 9);" ein Telegramm vom Multimeter empfangen wird. Zum senden wäre es die Funktion "write".

Es hilft sich zu erinnern, dass unter Linux alles eine Datei ist. Auch die Schnittstellen werden behandelt wie eine Datei. Sich mit den Grundlagen der seriellen Schnittstelle vertraut machen, hilft die Einzelheiten zu verstehen.

Ich hoffe es hilft dir weiter. Tom

Angehängte Dateien:
#7737536
Lesenswert?

Danke für eure Code-Beispiele.

Ich habe mal versucht, das Mulitmeter-Beispiel zu compilieren:

fltk-config --compile FLTK-SIO.cxx

Seltsamerweise wirft es sofort einige Fehler:

FLTK-SIO.cxx:16:1: error: ‘strSio’ does not name a type 16 | strSio = "/dev/ttyACM0"; // Schnittstelle ACM0 voreinstellen

Obwohl strSio in Zeile 12 definiert ist.

OP #7737656
Lesenswert?

Hallo Christoph.

Das Beispiel ist kein Programm zum kompilieren, sondern eine zusammenkopierte Reihe an Codestücken die du, an den jeweils richtigen Stellen, anpassen und in dein Programm einbauen kannst. Die Beispiele zeigen nur den Umgang mit der seriellen Schnittstelle.

Echten Quellcode für Programme kann man in diesem Forum leider nicht veröffentlichen. Wenn man keine end- und fruchtlosen Diskussionen um Kaisers Bart haben möchte, darf man keinen Schaltplan, kein Platinenlayout und keinen Quellcode zeigen.

Gruß. Tom

#7737696
Lesenswert?

Das Beispiel ist kein Programm zum kompilieren,

Danke, das habe ich leider zu spät gesehen.

Echten Quellcode für Programme kann man in diesem Forum leider nicht veröffentlichen. Wenn man keine end- und fruchtlosen Diskussionen um Kaisers Bart haben möchte, darf man keinen Schaltplan, kein Platinenlayout und keinen Quellcode zeigen.

Da hast Du recht, das Forum ist oft etwas nörgelig. Es gibt ja keinen perfekten Quellcode, deshalb kann man auch immer meckern.

Ich versuche immer trotzdem die Beispiele vollständig und kompilierbar zu halten ( inclusive Compilier-Command Line) wie im Beispiel oben:

Beitrag "Re: FLTK statisch linken"

Das sollte bei jedem Linux-Rechner einfach so laufen.

#7737992
Lesenswert?

Tom A. schrieb:

Echten Quellcode für Programme kann man in diesem Forum leider nicht veröffentlichen. Wenn man keine end- und fruchtlosen Diskussionen um Kaisers Bart haben möchte, darf man keinen Schaltplan, kein Platinenlayout und keinen Quellcode zeigen.

Das ist natürlich Quatsch, sofern man keinen besonders abnormen Programmierstil hat, oder sehr grobe Schnitzer in seinen Code eingebaut hat.

#7738053
Lesenswert?

Das ist natürlich Quatsch, sofern man keinen besonders abnormen Programmierstil hat, ...

Hier habe ich so etwas noch nicht erlebt, aber ein anderen Foren schon. Der eine sagt, man soll lange und aussagekräftige Namen verwenden. Gleichzeitig soll die Zeilenlänge 80 Zeichen nicht überschreiten.

Wieder andere verlangen das die geschweiften Klammern immer eine eigen Zeile belegen sollen. Ich finde das Quatsch, weil dadurch der Lesefluss unterbrochen wird (Bildschirme sind dafür nicht hoch genug). Oft wird man auch dafür kritisiert, dass man bestimmte Befehle oder Methoden verwendet oder nicht verwendet.

Bei ubuntuusers.de wurde ich mal z.B. nur dafür runtergemacht, weil ich eine Funktion selber programmieren wollte, die in einer Lib bereits vorhanden war (das Rad neu erfinden u.s.w.). Aber wie soll man dann Programmieren lernen, wenn man sich nicht an praktischen Problemen ausprobiert?

#7739445
Lesenswert?

Tom A.

Habe dir die Mail an die andere Adresse geschickt

Vielen Dank dafür. Nach einigen Mühen konnte ich das Programm kompilieren. Ich habe leider kein "Multimeter PDM-300-C2", deshalb habe ich es mit einem Arduino simuliert. Der Arduino kann damit als vermutlich etwas ungenauerer Ersatz der Spannungsmessung des Multimeters benutzt werden:

Beitrag "Multimeter PDM-300-C2 Simulator"

Vielleicht hat mal jemand Lust, es zu testen :-)

OP #7739497
Lesenswert?

Da das veröffentlichen von Quellcode hier im Forum zu nichts führt, halte ich mich damit sehr zurück. Das bedeutet aber nicht, dass die benötigten Funktionen der seriellen Schnittstelle ein Geheimnis sind. In diesem Beitrag:

Beitrag "Re: FLTK statisch linken"

ist im Anhang "FLTK-SIO.cxx" eine Sammlung von Funktionen zum Umgang mit der seriellen Schnittstelle in C/C++ zu finden.

Tom

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren