libs werden nicht in /usr/local gefunden.

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

libs werden nicht in /usr/local gefunden.

Beitrag von Mathias »

Ich habe mir die neuste libs-Packet von SDL3 besorgt.
Ich habe es Default kompiliert und installiert. Sämtliche libs und Header sind in /usr/local gelandet.
Dies wird mir auch schön brav angezeigt.

Code: Alles auswählen

$pkg-config sdl3 --libs 
-L/usr/local/lib/pkgconfig/../../lib -Wl,-rpath,/usr/local/lib/pkgconfig/../../lib -Wl,--enable-new-dtags -lSDL3
Unter C wir mir dies problemlos kompiliert und die entstandene bin läuft schön brav:

Code: Alles auswählen

gcc main.c -o test `pkg-config sdl3 --libs`
Wen ich folgendes Programm mit Lazarus kompiliere, wir dies auch anstandslos gemacht.

Code: Alles auswählen

program Project1;
const
    SDL_LibName = 'libSDL3.so.0';
type
  cuint8 = byte;
  PSDL_Version = ^TSDL_Version;

  TSDL_Version = record
    major, minor, patch: cuint8; 
  end;

  procedure SDL_GetVersion(ver: PSDL_Version); cdecl; external SDL_LibName;

var
  ver: TSDL_Version;
begin
  SDL_GetVersion(@ver);
  WriteLn(ver.major, '.', ver.minor, '.', ver.patch);
end.
Nur aber wen ich es ausführen will, kommt folgender Fehler:

Code: Alles auswählen

./Project1 
./Project1: error while loading shared libraries: libSDL3.so.0: cannot open shared object file: No such file or directory
Verschiebe ich die libSDL3.xxx von /usr/local/lib nach /usr/lib , dann geht auch das Lazarus-Programm

Woran liegt dies, das ein C-Programm die libs /usr/local/lib findet, und ein Lazarus-Programm nicht ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: libs werden nicht in /usr/local gefunden.

Beitrag von theo »


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

Re: libs werden nicht in /usr/local gefunden.

Beitrag von Mathias »

theo hat geschrieben:
Sa 4. Mär 2023, 16:29
Das schon gelesen?
https://wiki.freepascal.org/Lazarus/FPC_Libraries
Nein kannte ich nicht, jetzt ist das Problem weg.
Ein einfacher Aufruf von "sudo ldconfig" hat gereicht. Da der Pfad von /usr/local/lib hier schon vorhanden ist.: "/etc/ld.so.conf.d/libc.conf"

Da habe ich genauer geguckt, was es mit der Datei "/etc/ld.so.conf" auf sich hat. da war ein Iclude welches auf "/etc/ld.so.conf.d" zeigt.
Da habe ich folgende Datei erstellt: "/etc/ld.so.conf.d/sdl.conf" und dies rein geschrieben: "/home/tux/Schreibtisch/SDL-main/build", dort ist die Quelle von SDL3. Wieder "sudo ldconfig" aufgerufen und siehe da jetzt nimmt er die libs von meinem Home-Ordner.

Was mir aber immer noch ein Rätsel ist, wieso lief das Programm von Lazarus nicht, aber das von C schon ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

PascalDragon
Beiträge: 830
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: libs werden nicht in /usr/local gefunden.

Beitrag von PascalDragon »

Mathias hat geschrieben:
Sa 4. Mär 2023, 17:41
Was mir aber immer noch ein Rätsel ist, wieso lief das Programm von Lazarus nicht, aber das von C schon ?
Des Rätsels Lösung liegt in der Ausgabe von pkg-config, die du am Anfang angegeben hast:

Code: Alles auswählen

$pkg-config sdl3 --libs 
-L/usr/local/lib/pkgconfig/../../lib -Wl,-rpath,/usr/local/lib/pkgconfig/../../lib -Wl,--enable-new-dtags -lSDL3
Der entscheidende Punkt ist hier die rpath Option. Um Wikipedia zu zitieren:
In computing, rpath designates the run-time search path hard-coded in an executable file or library. Dynamic linking loaders use the rpath to find required libraries.
Der Suchpfad, den du mit Hilfe von ldconfig angepasst hast, wurde im Fall von gcc bereits in die ELF Binary kodiert. Auf einem anderen System, bei dem sdl3 womöglich in einem anderen Verzeichnis ist (zum Beispiel stattdessen /opt/sdl3/lib) und dieser Pfad nicht im Bibliothekssuchpfad ist, würde die Anwendung ebenfalls nicht funktionieren.
FPC Compiler Entwickler

Antworten