C++ QT: Libs teilweise statisch linken für Abwärtskompatibilität

T_55

Lieutenant
Registriert
Feb. 2013
Beiträge
638
Hallo,

normalerweise bin ich, um QT Anwendungen auf fremden PCs auszuführen, so vorgegangen:
QMAKE_LFLAGS += -Wl,-rpath,"'\$$ORIGIN'"
und dann kopiert man die shared libs wie zB libQt5Core.so.5.xx.x mit der Verknüpfung libQt5Core.so.5 in den Ordner des Programms.
Mit ldd -v ./anwendung findet man heraus welche files gebraucht werden.

Jetzt habe ich den Fall, dass das OS auf dem Ziel PCs von der Version etwas älter bzw unterschiedlich alt sind so etwa bis debian buster runter. Erstellt wird auf Bullseye. Da ich mit dem Programm alle shared libs mitschleppe dachte ich alles kein Problem aber weit gefehlt.
Fehler beim Öffnen der Anwendung libpcre2-16.so.0 cannot open shared object file: No such file or directory
Aber libpcre2-16.so.0.9.0 und die Verknüpfung libpcre2-16.so.0 sind im Ordner vorhanden. Also sozusagen ein unbegründeter Fehler.

Ab dann kam die Idee statisch zu linken da mich das shared-libs geschleppe eh schon immer nervt und mit den QT Sachen ja sowieso nicht geht (QMAKE_LFLAGS += -static wirft Fehler da keine .a vorhanden). Ok ohne darüber weiter zu meckern wie man so überhaupt ansatzweise Software schreiben will die halbwegs abwärtskompatibel ist eben jetzt der Ansatz nur die QT shared Libs rein zu tun aber dann wenigstens den Rest static.
INCLUDEPATH += /usr/include/c++/9/
LIBS += "/usr/lib/x86_64-linux-gnu/libpcre2-16.a"
rufe ich ldd -v auf wird klar das die Abhängigkeiten weiter von der .so Abhängen also nicht statisch sind.
Das gleiche übrigens mit libstdc++.a und libgcc.a
Auch QMAKE_LFLAGS += -static-libstdc++ -static-libgcc will nicht statisch werden.
Und ja die .a Files existieren wirklich.

Sitze jetzt seit gestern Nachmittag dran, Nacht durchgemacht, gefühlt 1000 stackoverflow Beiträge gelesen und alles mögliche ausprobiert keine Ahnung mehr wie man jetzt da weiterkommt. Auch viele Merkwürdigkeiten bei allem zb mit libboost_system.a wiederum funktioniert der Ansatz mit direkten Verweis auf .a Datei. Und ich habe auch eine Größenänderung der File festgestellt die auf static hinweist, es dann aber eben nicht ist...
Hier wohl ähliches Problem: https://forum.qt.io/topic/46295/com...raries-and-static-gcc-libraries-under-linux/9

Das Endziel ist, dass das Programm möglichst ohne größere Anpassungen auf den Zielrechnern läuft die eben unterschiedliche bzw etwas ältere Versionen haben können. Eine Abwärtskompatibilität von Bullseye bis Stretch würde ja schon reichen.

Meine Ansätze sind alle gescheitert, entweder man löst Problem 1: (libpcre2-16.so.0 cannot open shared object file: No such file or directory) obwohl die Files in echt da sind. Ist wahrscheinlich auch nur die erste File die angezeigt wird, den Fehler würde dann evt auch eine andere File werfen, werden ja einige bei ldd -v angezeigt.
Oder 2: man schafft es libs statisch zu linken während man die QT Dinge dynamisch lässt. Der Versuch wie oben mit direkt auf .a ging nicht oder was falsch gemacht?
Oder 3. Idee, man setzt QMAKE_LFLAGS += -static und definiert die QT Dinge irgendwie als shared damit dann QT keinen Fehler wirft, also der umgekehrte ansatz statt shared als default eben static als default. static als default wäre mir sowieso lieber aber geht das mit QT, kann man die QT shared libs irgendwie in der .pro als shared markieren dass mit -static kein Fehler kommt?
Oder 4. man kompiliert QT selbst so das man alles statisch linken kann, sah aber auf den ersten Blick extrem kompliziert aus... Am Ende stören mich aber die paar Files von QT nicht wirklich, die können auch gerne shared bleiben, der Rest gern static aber selbst wenn dynamisch wäre auch ok, Hauptsache eine Lösung die irgendwie überhaupt funktioniert. Es darf doch nicht sein, dass durch solche Hürden Programme so unglaublich unkompatibel werden.

Gruß
 
Zuletzt bearbeitet:
Bitte nicht statisch linken, wenn das jeder machen würde :O
maybe:
sudo ldconfig
LD_LIBRARY_PATH
...
 
Hast du mal versucht, deine Quellen auf das Target zu schieben und dort zu bauen (und dann die dort installierte QT-Version zu nutzen)?

Die Libs deiner QT-Installation mit zu deployen halte ich für fragwürdig
 
Ende vom Lied Ziel-Computer ist komplett zerschossen, "Kernel panic", fährt nicht mehr hoch auch nicht im abgesicherten Modus.

janeeisklar schrieb:
Bitte nicht statisch linken, wenn das jeder machen würde :O
Wieso, ich sehe nur den Nachteil der Dateigröße aber beim heutigem Speicherplatz wäre mir egal ob das Programm 3 oder 5 MB hat. Ansonsten gibts doch nur Ärger und Inkompatibilität mit den Shared zumindest ist das meine aktuelle schmerzhafte Erfahrung.

janeeisklar schrieb:
maybe:
sudo ldconfig
LD_LIBRARY_PATH

Habe in die Richtung mal probiert und einen Ordner angelegt und die von ldd angezeigten Files reingeschoben. Dann das Verzeichnis in /etc/ld.so.conf eingefügt und zum aktualisieren ldconfig ausgeführt. Etwa wie hier beschrieben.
http://www.linux-praxis.de/lpic1/lpi101/1.102.4.html
Zu Beginn hatte ich wohl zuviele libs drin welche das OS evt sebst hatte, habe daher dann reduziert. Irgendwann ist dann beim Ausführen des Programms nicht mehr der klassische shared libs Fehler aufgetaucht sondern der Fehler "Speicherzugriffsverletzung". Ok dann war klar es wird nicht besser, dann normale OS Funktionen wie abmelden etc ließen sich nicht mehr ausführen, dann nach hartem reboot "Kernel panic" beim hochfahren. Das Ding kann man neu aufsetzen denke ich, da geht nix mehr auch nicht recovery. Irgendwas hab ich da falsch gemacht obwohl ich mit root eigentlich nicht viel gemacht habe außer den neuen lib-Ordner in /etc/ld.so.conf einzufügen.

Revan1710 schrieb:
Hast du mal versucht, deine Quellen auf das Target zu schieben und dort zu bauen (und dann die dort installierte QT-Version zu nutzen)?
Das würde sicherlich klappen aber auf jedem Ziel-PC die Source zu haben und dort extra zu kompilieren ist einfach ziemlich umständlich. Ich dachte immer Sinn und Zweck einer ausführbaren Datei ist das man sie auf unterschiedlichen PCs einfach ausführen kann, ok bei dieser naiven Annahme hat sich inzwischen Ernüchterung eingestellt ;)

Revan1710 schrieb:
Die Libs deiner QT-Installation mit zu deployen halte ich für fragwürdig
Ist auch nur eine Idee aus der Ratlosigkeit nachdem man unzählige Stunden ohne Ergebnis Dinge versucht um ein normales Programm ausführen zu können. Die shared QT Libs sind auch kein Thema, habe ich bisher auch immer so gemacht, es ist der Rest der shared nicht klappt und static leider auch nicht. Wäre ja um eine Lösung froh aber es gibt derzeit keine einzige außer das alle OS komplett identisch sein müssten was ja nicht ernsthaft eine zufriedenstellende Lösung sein kann. Oder soll das normal sein, dass ein Programm nur auf dem PC läuft auf dem es kompiliert wurde, wäre zumindest nicht wirklich die Spitze der Evolution.

Hätte im Leben nicht gedacht, dass so eine simple Sache wie ein Programm einfach auf einem anderen PC auszuführen zeitlich so eskaliert.
Ich finde auch der Ansatz, erst an den Ziel PCs herumdoktorn zu müssen am besten mit einem Doktor der Linux-Kernel-Kunde, damit normale Programme darauf laufen (oder gar dort kompilieren zu müssen) völlig überkompliziert und abwegig. Ziel eines kompilierten Programms sollte doch sein, dass es einfach auf möglichst vielen Maschinen läuft.
 
Ka ob es dir hilft, aber 'deploy' ist der Begriff, mit dem du evtl noch nicht gegoogelt hast. So bezeichnet man eben das ausliefern von SW. Und dein ldd Weg scheint nicht ganz verkehrt zu sein: https://stackoverflow.com/a/52018120
Hier ist ne Anleitung zum statischen Linken: https://doc.qt.io/qt-5/linux-deployment.html
Wobei das mit lgpl evtl nicht erlaubt ist

Es gehört leider dazu, dass man vorm ausliefern in einer kundenähnlichen Umgebung/VM testen muss. Idealerweise automatisiert und in verschiedenen Kundenausprägungen.

Ich würd dir empfehlen erstmal dein Problem hier weiter versuchen zu lösen mit dem ersten dynamisch-linken Weg:
"libpcre2-16.so.0 cannot open shared object file: No such file or directory "
https://stackoverflow.com/q/8501163
 
T_55 schrieb:
Das würde sicherlich klappen aber auf jedem Ziel-PC die Source zu haben und dort extra zu kompilieren ist einfach ziemlich umständlich
Ja das wäre auch nur testweise, ob das Programm generell mit den QT-Libs auf dem Target läuft oder noch irgendwelche anderen Libs fehlen, die bspw. Compiler-abhängig sind.

Oder soll das normal sein, dass ein Programm nur auf dem PC läuft auf dem es kompiliert wurde, wäre zumindest nicht wirklich die Spitze der Evolution
Das kommt auch immer darauf an, wie stark sich Entwicklungs- und Zielsystem unterscheiden. Wenn du bspw. auf einem 64-Bit System entwickelst und das Programm auf einem 32-Bit System laufen soll, kommst du nicht darum herum, alles mit den entsprechenden Tools für diese Architektur zu bauen.
 
Zurück
Oben