Shared libraries in Linux in welchen Path

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Acia6850
Beiträge: 37
Registriert: Mo 9. Okt 2023, 18:45
OS, Lazarus, FPC: Windows + WSL / Linux Debian Rasbian OS (L 3.0.0 FPC 3.3.2)
CPU-Target: 64Bit
Wohnort: LK Ludwigsburg

Shared libraries in Linux in welchen Path

Beitrag von Acia6850 »

Hallo ich habe eine Consolen Anwendung in Windows 10 64Bit geschrieben welche verschiedene C-Libs benötigt.

In Windows werden die Dlls im Exe verzeichniss hinterlegt.

Die C-Libs und die Lazarus Exe habe ich nach Linux portiert (Raspi OS 64 Bit, Linux Debian 64 Bit und Linux Mit 64 Bit)
sie laufen auf allen Systemen.

Nun die Frage : in welches Verzeichnis in Linux kopiert man die Shared Libraries ohne das man den Library-Path in Linux setzen muss.

Mathias
Beiträge: 6955
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Shared libraries in Linux in welchen Path

Beitrag von Mathias »

Nun die Frage : in welches Verzeichnis in Linux kopiert man die Shared Libraries ohne das man den Library-Path in Linux setzen muss.
Wen du die *.so und *.so.x.x meinst, am besten in /usr/local/lib

Um welche C-Libs handelt es sich ?
Selbst gebaute oder um fertige Standard-Libs ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
juelin
Beiträge: 296
Registriert: Sa 24. Jul 2021, 18:03
OS, Lazarus, FPC: Linux Ubuntu 22. Windows 10 Delphi 11.3 (L 0.9.xy FPC 2.2.z)
CPU-Target: 64Bit
Wohnort: Mannheim

Re: Shared libraries in Linux in welchen Path

Beitrag von juelin »

versuch es mal in /usr/lib
Gruß
Jürgen

Benutzeravatar
photor
Beiträge: 523
Registriert: Mo 24. Jan 2011, 21:38
OS, Lazarus, FPC: Arch Linux: L 3.2 (Gtk2) FPC 3.2.2
CPU-Target: 64Bit

Re: Shared libraries in Linux in welchen Path

Beitrag von photor »

juelin hat geschrieben: Do 12. Sep 2024, 22:54 versuch es mal in /usr/lib
Moin,

also eigentlich gehören in /usr/lib nur System-eigene Libs (also solche, die vom Package-System verwaltet werden). Deshalb würde ich die auch eher nach /usr/local/lib packen.

Ciao,
Photor

Mathias
Beiträge: 6955
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Shared libraries in Linux in welchen Path

Beitrag von Mathias »

also eigentlich gehören in /usr/lib nur System-eigene Libs (also solche, die vom Package-System verwaltet werden). Deshalb würde ich die auch eher nach /usr/local/lib packen.
Genau so ist es.

Kommerzielle libs kommen in /opt/packetname/lib
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Warf
Beiträge: 2141
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Shared libraries in Linux in welchen Path

Beitrag von Warf »

Wenn du die Bibliotheken selbst für diese Anwendung gebaut hast, am besten nicht system weit installieren sondern einfach lokal mitliefern und über die LD_LIBRARY_PATH Umgebungsvariable den Suchpfad angeben. Typischerweise baut man sich eine kleine Ordnerstruktur mit program/bin, program/lib program/share, etc. Das kann man dann irgendwo installieren, z.B. im Nutzerordner oder Systemweit in /opt. Und Dann ein start script nutzen die subpfade zu den Umgebungsvariablen hinzufügt bevor es dann das hauptprogramm startet.

Wenn du die Sachen systemweit installieren kannst du das selbe machen und nach /opt verschieben, und dann symlinks in /usr/local erstellen

Benutzeravatar
Zvoni
Beiträge: 396
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: Shared libraries in Linux in welchen Path

Beitrag von Zvoni »

Ich würde mir erstmal die Frage stellen, welche ANDEREN Programme AUSSER deiner Konsolen-Anwendung auf diese lib's zugreifen müssen/sollen/wollen.

Weil wenn die Antwort nämlich KEINE ist, dann würde ich sie direkt im Verzeichnis deiner Anwendung belassen (ggfs. in Unterordner dort, wie auch bereits von Warf erwähnt)
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Acia6850
Beiträge: 37
Registriert: Mo 9. Okt 2023, 18:45
OS, Lazarus, FPC: Windows + WSL / Linux Debian Rasbian OS (L 3.0.0 FPC 3.3.2)
CPU-Target: 64Bit
Wohnort: LK Ludwigsburg

Re: Shared libraries in Linux in welchen Path

Beitrag von Acia6850 »

Vielen Dank für die Antworten und Beispiele.

Ich habe mir überlegt den Aufruf von ($LD_LIBRARY_PATH) in ein shell script oder in die Lazarus Exe zu in­te­g­rie­ren.

Die shared Library kommt in das gleiche Verzeichnis wie die Lazarus Anwendung.

Die Anwendung prüft zuerst das vorhandensein der Library-Datei.
Bei Erfolg wird der ($LD_LIBRARY_PATH) hinzugefügt und dann die Library-Datei dynamisch geladen.

So wäre der Aufruf für den Anwender und die Installation der Applikation am einfachsten.

Grüße Acia6850

Benutzeravatar
Zvoni
Beiträge: 396
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: Shared libraries in Linux in welchen Path

Beitrag von Zvoni »

Acia6850 hat geschrieben: Mo 16. Sep 2024, 12:42 Die Anwendung prüft zuerst das vorhandensein der Library-Datei.
Bei Erfolg wird der ($LD_LIBRARY_PATH) hinzugefügt und dann die Library-Datei dynamisch geladen.
Wozu das ganze LD_LIBRARY_PATH-Gehampel??
https://www.freepascal.org/docs-html/3. ... brary.html
No assumptions should be made about the location of the loaded library if a relative pathname is specified. The behaviour is dependent on the platform. Therefore it is best to specify an absolute pathname if possible.
Da du sowieso das vorhandensein der lib prüfst (FileExists?), benutz doch einfach den absoluten Pfad, und gut ist.
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Benutzeravatar
photor
Beiträge: 523
Registriert: Mo 24. Jan 2011, 21:38
OS, Lazarus, FPC: Arch Linux: L 3.2 (Gtk2) FPC 3.2.2
CPU-Target: 64Bit

Re: Shared libraries in Linux in welchen Path

Beitrag von photor »

Zvoni hat geschrieben: Mo 16. Sep 2024, 13:06
Acia6850 hat geschrieben: Mo 16. Sep 2024, 12:42 Die Anwendung prüft zuerst das vorhandensein der Library-Datei.
Bei Erfolg wird der ($LD_LIBRARY_PATH) hinzugefügt und dann die Library-Datei dynamisch geladen.
Wozu das ganze LD_LIBRARY_PATH-Gehampel??
https://www.freepascal.org/docs-html/3. ... brary.html
No assumptions should be made about the location of the loaded library if a relative pathname is specified. The behaviour is dependent on the platform. Therefore it is best to specify an absolute pathname if possible.
Da du sowieso das vorhandensein der lib prüfst (FileExists?), benutz doch einfach den absoluten Pfad, und gut ist.
Eine kurze Anmerkung hierzu: ich hatte mich gewundert, dass ich auf meinem ArchLinux keinen LD_LIBRARY_PATH (z.B. mittels env | grep LIB gefunden habe.

Wenn ich meine (noch kurze) Recherche richtig verstehe, wird in den heutigen Linuxen diese Environment-Variable so direkt nicht mehr gesetzt. Es gibt wohl mittlerweile andere Mechanismen.

Also, bevor hier zu viele Lösungen um genau diese drehen. Ich gebe aber zu, dass ich auch überrascht bin - und wohl mal mein Linux-Wissen aktualisieren müsste.

Ciao,
Photor

Benutzeravatar
Zvoni
Beiträge: 396
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: Shared libraries in Linux in welchen Path

Beitrag von Zvoni »

Ich verstehe immer noch nicht, warum auf dem LD_LIBRARY_PATH rumgeritten wird.
LD_LIBRARY_PATH wird bekanntlich gebraucht, um systemweit libs zu finden bzw. MEHREREN Programmen die chance zu geben, ein und diesselbe lib zu nutzen, welches wiederum impliziert, dass diese lib an einem "zentralen" Ort liegt
OP hat doch selbst schon bestätigt, dass seine lib im gleichen Ordner wie seine executable liegt, und er sowieso erst prüft, ob die so überhaupt vorhanden ist.

LD_LIBRARY_PATH ist vollkommen überflüssig hier, vorausgesetzt, seine Konsolenanwendung ist das EINZIGE Programm was diese lib braucht
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Benutzeravatar
photor
Beiträge: 523
Registriert: Mo 24. Jan 2011, 21:38
OS, Lazarus, FPC: Arch Linux: L 3.2 (Gtk2) FPC 3.2.2
CPU-Target: 64Bit

Re: Shared libraries in Linux in welchen Path

Beitrag von photor »

Zvoni hat geschrieben: Mo 16. Sep 2024, 15:55 LD_LIBRARY_PATH ist vollkommen überflüssig hier, vorausgesetzt, seine Konsolenanwendung ist das EINZIGE Programm was diese lib braucht
Ich gebe dir vollkommen Recht: ich würde eine Lib immer da unterbringen, wo sie gebraucht wird:
  • im Programmverzeichnis, wenn die nur für dieses eine Programm gebraucht wird
  • im User-Verzeichnis (z.B. ~USER/lib/) wenn nur ein User diese Lib braucht
  • systemweit, wenn eine Lib im ganzen System gebraucht wird (z.B. /uss/local/lib - wenn nicht vom Packege-Manager verwaltet; sonst /usr/lib wenn doch - aber dann ist die Diskussion überflüssig)
So ist zumindest mein Verständnis. Da ich nicht wirklich weiß, was der Frager will, ...

Ciao,
Photor

Warf
Beiträge: 2141
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Shared libraries in Linux in welchen Path

Beitrag von Warf »

Zvoni hat geschrieben: Mo 16. Sep 2024, 15:55 OP hat doch selbst schon bestätigt, dass seine lib im gleichen Ordner wie seine executable liegt, und er sowieso erst prüft, ob die so überhaupt vorhanden ist.

LD_LIBRARY_PATH ist vollkommen überflüssig hier, vorausgesetzt, seine Konsolenanwendung ist das EINZIGE Programm was diese lib braucht
Wir reden hier aber nicht von Windows sondern von Linux. Der executable pfad ist in Linux im gegensatz zu Windows nicht Teil des Suchpfades: https://man7.org/linux/man-pages/man8/ld.so.8.html

Code: Alles auswählen

       (1)  Using the directories specified in the DT_RPATH dynamic
            section attribute of the binary if present and DT_RUNPATH
            attribute does not exist.

       (2)  Using the environment variable LD_LIBRARY_PATH, unless the
            executable is being run in secure-execution mode (see
            below), in which case this variable is ignored.

       (3)  Using the directories specified in the DT_RUNPATH dynamic
            section attribute of the binary if present.  Such
            directories are searched only to find those objects required
            by DT_NEEDED (direct dependencies) entries and do not apply
            to those objects' children, which must themselves have their
            own DT_RUNPATH entries.  This is unlike DT_RPATH, which is
            applied to searches for all children in the dependency tree.

       (4)  From the cache file /etc/ld.so.cache, which contains a
            compiled list of candidate shared objects previously found
            in the augmented library path.  If, however, the binary was
            linked with the -z nodefaultlib linker option, shared
            objects in the default paths are skipped.  Shared objects
            installed in hardware capability directories (see below) are
            preferred to other shared objects.

       (5)  In the default path /lib, and then /usr/lib.  (On some
            64-bit architectures, the default paths for 64-bit shared
            objects are /lib64, and then /usr/lib64.)  If the binary was
            linked with the -z nodefaultlib linker option, this step is
            skipped.
Das Programmverzeichnis ist nicht enthalten. D.h. wenn man den Suchpfad nicht über LD_LIBRARY_PATH angibt, wird das Program die Bibliothek nicht finden, selbst wenn sie im selben Verzeichnis liegt.

Das ganze macht auch Sinn denn was ist das Verzeichnis in dem die Executable liegt? Unter Linux wird sehr viel mit Symlinks gearbeitet, und wenn man z.B. ArgV[0] checkt, ist da der Pfad des Symlinks drin, nicht der Pfad des Programms (FPC macht ne dynamische Auflösung wenn man ParamStr(0) aufruft). Für das System ist komplett transparent wo das Programm eigentlich liegt.

Benutzeravatar
Zvoni
Beiträge: 396
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: Shared libraries in Linux in welchen Path

Beitrag von Zvoni »

Warf hat geschrieben: Mo 16. Sep 2024, 21:13 Das Programmverzeichnis ist nicht enthalten. D.h. wenn man den Suchpfad nicht über LD_LIBRARY_PATH angibt, wird das Program die Bibliothek nicht finden, selbst wenn sie im selben Verzeichnis liegt.

Das ganze macht auch Sinn denn was ist das Verzeichnis in dem die Executable liegt? Unter Linux wird sehr viel mit Symlinks gearbeitet, und wenn man z.B. ArgV[0] checkt, ist da der Pfad des Symlinks drin, nicht der Pfad des Programms (FPC macht ne dynamische Auflösung wenn man ParamStr(0) aufruft). Für das System ist komplett transparent wo das Programm eigentlich liegt.
Und du hast leider den wichtigen Teil überlesen
Acia6850 hat geschrieben: Mo 16. Sep 2024, 12:42 Vielen Dank für die Antworten und Beispiele.

Ich habe mir überlegt den Aufruf von ($LD_LIBRARY_PATH) in ein shell script oder in die Lazarus Exe zu in­te­g­rie­ren.

Die shared Library kommt in das gleiche Verzeichnis wie die Lazarus Anwendung.

Die Anwendung prüft zuerst das vorhandensein der Library-Datei.
Bei Erfolg wird der ($LD_LIBRARY_PATH) hinzugefügt und dann die Library-Datei dynamisch geladen.


So wäre der Aufruf für den Anwender und die Installation der Applikation am einfachsten.

Grüße Acia6850
Er prüft ZUERST, ob seine lib überhaupt vorhanden ist!! Bedeutet: Er hat bereits die File-Location der lib!!
Er braucht nur den absoluten Pfad für LoadLibrary zu nehmen

EDIT: OK, ich glaube, ich muss ein wenig zurückrudern.
LD_LIBRARY_PATH wird NICHT benötigt, wenn OP voll dynamisch die lib laden will (mit "LoadLibrary" und "GetProcAddress")

Wenn OP aber dieses seltsame "halb-dynamisch/halb-statische" Verfahren benutzt

Code: Alles auswählen

Function Foo(SomeArg:cint):cint;cdecl;external 'somelib.so';
Dann kommt LD_LIBRARY_PATH tatsächlich ins Spiel (glaub ich zumindest)

Ich glaube wir haben alle irgendwie aneinander vorbeigeredet....
Zuletzt geändert von Zvoni am Mi 18. Sep 2024, 10:59, insgesamt 1-mal geändert.
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Shared libraries in Linux in welchen Path

Beitrag von Socke »

Zvoni hat geschrieben: Di 17. Sep 2024, 08:05 EDIT: OK, ich glaube, ich muss ein wenig zurückrudern.
LD_LIBRARY_PATH wird NICHT benötigt, wenn OP voll dynmaisch die lib laden will (mit "LoadLibrary" und "GetProcAddress")

Wenn OP aber dieses seltsame "halb-dynamisch/halb-statische" Verfahren benutzt

Code: Alles auswählen

Function Foo(SomeArg:cint):cint;cdecl;external 'somelib.so';
Dann kommt LD_LIBRARY_PATH tatsächlich ins Spiel (glaub ich zumindest)

Ich glaube wir haben alle irgendwie aneinander vorbeigeredet....
Damit ein vollständiges Bild herrscht:
  • Beim statischen Linken werden die Bibliotheken durch den Linker direkt in das Executable eingebunden. Ein Nachladen zur Laufzeit ist nicht notwendig - das passiert mit allen im Programm verwendeten Free Pascal Units.
  • Beim dynamischen Linken unterscheidet man zwischen early binding und late binding
    • Beim early binding wird dem Compiler/Linker mitgegeben, welche Bibliothek und welche Funktionen daraus genutzt werden. Diese Informationen werden in die Programmdatei geschrieben, sodass der Betriebssytemlinker beim Programmstart (bevor der Code darin ausgeführt wird) die Bibliotheken suchen und nachladen kann. Warf hat das Verfahren gut beschrieben/zitiert. Über den beschriebenen Mechanismus kann man gut kontrollieren, welche Programme welche Bibliotheken finden. Wird die Umgebungsvariable LD_LIBRARY_PATH in einem Shell Script vor Programmstart gesetzt wird, gilt sie auch nur dort und nicht für das ganze System.
    • Beim late binding gibt das Programm zur Laufzeit dem Betriebssystem mit, welche Bibliotheken geladen werden soll. Da das Programm selbst die Anweisungen dazu gibt, muss das early binding bereits abgeschlossen sein und das Program läuft bereits. Die Funktionen dazu sind LoadLibrary() und GetProcedureAddress(). Dieses Verfahren erlaubt ein granulares Fehlerhandling durch den Programmierer (andere Orte/Bibliotheken/Versionen der selben Bibliothek suchen/ausprobieren), ist in der Programmierung aber deutlich aufwändiger. Es bietet sich daher bei optionalen Bibliotheken oder Plugins an.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Antworten