Library einbinden ... [ gelöst }

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Library einbinden ... [ gelöst }

Beitrag von corpsman »

Wie man Hier lesen kann, ist es mir nun gelungen eine *.so Datei zu erzeugen.

und mittels

objdump -x delforlazarus.so


sieht man auch das es funktioniert hat.

Doch leider Kompiliert meine "Demo" applikation die ich im Anhang mit angehängt habe, leider nicht.

aus

/sda5/sda5/Tools/Projects/DelForLazarus/oobjects.pas(43,24) Hint: Parameter "Item" not used
/sda5/sda5/Tools/Projects/DelForLazarus/oobjects.pas(140,27) Hint: Local variable "I" does not seem to be initialized
/sda5/sda5/Tools/Projects/DelForLazarus/oobjects.pas(153,31) Hint: Local variable "Index" does not seem to be initialized
unit1.pas(33,51) Hint: Parameter "CanClose" not used
/usr/bin/ld: warning: /sda5/sda5/Tools/Projects/DelForLazarus/TestApp_So/link.res contains output sections; did you forget -T?
/usr/bin/ld: cannot find -ldelforlazarus
project1.lpr(20,1) Error: Error while linking
project1.lpr(20,1) Fatal: There were 1 errors compiling module, stopping


Werde ich nun aber nicht schlau, denn Schließlich liegt die so file direkt im Pfad.

Diese Ominöse link.res, legt der Kompiler auch an, aber was es mit dieser auf sich hat habe ich auch noch nicht verstanden.

verrät mir jemand was ich nun schon wieder falshc gemacht habe ?

Die Library habe ich mittels :

Code: Alles auswählen

library delforlazarus;
 
{$mode objfpc}{$H+}
 
uses
  Classes,
  delforinterf
  { you can add units after this };
 
{$IFDEF WINDOWS}{$R delforlazarus.rc}{$ENDIF}
 
exports
  Formatter_Destroy,
  Formatter_Create,
  Formatter_LoadFromFile,
  Formatter_LoadFromList,
  Formatter_Parse,
  Formatter_Clear,
  Formatter_WriteToFile,
  Formatter_GetTextStr,
  Formatter_SetTextStr,
  Formatter_SetOnProgress,
  Formatter_LoadCapFile,
  Formatter_SaveCapFile,
  Formatter_Version;
 
end.


Erzeugt.
Dateianhänge
delfor.tar.gz
(350.51 KiB) 93-mal heruntergeladen
Zuletzt geändert von corpsman am Do 3. Sep 2009, 20:04, insgesamt 1-mal geändert.
--
Just try it

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Re: Library einbinden ...

Beitrag von Targion »

Benenne die lib in "libdelforlazarus.so" um und erzeuge einen Symlink in /usr/lib

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Library einbinden ...

Beitrag von corpsman »

geht auch nicht,

aber mein "Linux guru" den ich hier immer so konsultiere behauptet das die File zwar *.so heist, aber eine Statische Library ist, d.h. er meint , da müsse man wohl noch irgend ein Flag setzen , damit hier eine "Dynamische" library erzeugt wird. Wo geht das, bzw weis jemand das flag ?

das sieht man wenn man sich die file mit "ldd" anzeigt.
--
Just try it

creed steiger
Beiträge: 957
Registriert: Mo 11. Sep 2006, 22:56

Re: Library einbinden ...

Beitrag von creed steiger »

ldconfig schon ausgeführt?

Als Grundlage:
http://www.linux.org/docs/ldp/howto/Pro ... aries.html

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Re: Library einbinden ...

Beitrag von Targion »

Lib umbenennen und nach /usr/lib kopieren. - Fertig. Einfacher geht's nicht.

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Library einbinden ...

Beitrag von corpsman »

@Targion
das Umbenennen allein ändert ja das Linking nicht ...

@creed steiger
corpsman@corpsman2:/sda5/sda5/Tools/Projects/DelForLazarus/TestApp_So$ ldconfig -n libdelforlazarus.so
corpsman@corpsman2:/sda5/sda5/Tools/Projects/DelForLazarus/TestApp_So$ ldd libdelforlazarus.so
statically linked
corpsman@corpsman2:/sda5/sda5/Tools/Projects/DelForLazarus/TestApp_So$ ./project1
./project1: error while loading shared libraries: delforlazarus.so: cannot open shared object file: No such file or directory


und das obwohl die Libdelforlazarus.so im Verzeichnis der Anwendung UND in /usr/lib liegt, beide natürlich mit ldconfig bearbeitet ...
--
Just try it

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Re: Library einbinden ...

Beitrag von Targion »

Wie bindest du die Lib ein?

creed steiger
Beiträge: 957
Registriert: Mo 11. Sep 2006, 22:56

Re: Library einbinden ...

Beitrag von creed steiger »

Was bringt den ldd project1 (oder wieauchimmerdeinprogrammheisst)?

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Library einbinden ...

Beitrag von corpsman »

So ich hab das Problem nun mal in ein "Sample" extrahiert, hier sind alle Sourcen vorhanden.

und der Fehler ist der Selbe.

Beim Start der Anwendung kommt ein "oops ..." irgendwas mit debugger Fehler, wenn man dann das "Project1" in der Konsole startet kommt der selbe Fehler :

corpsman@corpsman2:~/Desktop/Sample$ ./project1
./project1: error while loading shared libraries: libdemo.so: cannot open shared object file: No such file or directory
Dateianhänge
sample.tar.gz
(294.28 KiB) 82-mal heruntergeladen
--
Just try it

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Library einbinden ...

Beitrag von corpsman »

So einen gewissen Teilerfolg habe ich nun erstritten

Code: Alles auswählen

uses dynlibs;
 
type  TBlub = Procedure (Value: PChar); stdcall;
 
procedure TForm1.Button1Click(Sender: TObject);
var s : String;
    lib :TLibHandle;
    b :TBlub;
begin
  s := IncludeTrailingBackslash( ExtractFilePath(Paramstr(0)));
  lib := LoadLibrary(s + 'libdemo.so');
  if lib = 0 then begin
    showmessage('Error Lib not found');
    exit;
  end;
  b := TBlub(GetProcedureAddress(lib, 'Showm'));
  if not assigned(b) then begin
    showmessage('Error Procedure "Showm" not found');
    exit;
  end;
  s := 'Hello World';
  b(@s[1]);
end;


Das dynamische laden geht, nur eben leider nicht mittels "External" im Code wie mans gewöhnt ist :)
--
Just try it

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Re: Library einbinden ...

Beitrag von Targion »

Also bei mir funktioniert's einwandfrei.
Im Anhang mal ein Kompilat für x86_64 Linux GTK2
Dateianhänge
sample-compiled.tar.gz
(1.82 MiB) 85-mal heruntergeladen

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Library einbinden ...

Beitrag von corpsman »

hmm, ich hab ein 32 bit system, kann es also leider nicht testen, was sagt denn das ldd bei dir ?


corpsman@corpsman2:~/Desktop/sample-compiled$ ldd libdemo.so
not a dynamic executable
corpsman@corpsman2:~/Desktop/sample-compiled$

Welches Linux hast du denn ? Evtl liegt es daran ?

Der Witz ist ja das es mit dieser "Dynlib" geht.

Wie gesagt mein "Linux Guru" den ich da immer befrage behauptet ja das es an der *.so File liegen mus, und wenn man bedenkt das ldd auch sagt das in der File nur Statik Linking wäre glaube ich ihm dahingegen schon ein wenig.

Die Frage / Schlusfolgerung die ich daraus ziehe ist also, welche Compilerswitches mus man da evtl noch extra setzen. Ich hab auch schon versucht nach entsprechenden Tutorials zu suchen. Doch auser dem Trivialen sagen die leider auch nicht mehr aus...

Ob STDCall oder CDECL oder gar keine Angabe, spielt übrigens keine Rolle, ..
--
Just try it

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Re: Library einbinden ...

Beitrag von Targion »

Ich benutze Ubuntu 9.10 (Alpha), die Lazarus-Version aus meinem PPA, FPC 2.2.4-3, ldd sagt, dass die lib statisch gelinkt ist, aber das ist egal.
Kompiliere mal meine Sourcen, es fehlte nämlich bei deinen eine lrs-Ressource, die ich hinzugefügt habe.

Code: Alles auswählen

corpsman@corpsman2:/sda5/sda5/Tools/Projects/DelForLazarus/TestApp_So$ ./project1
./project1: error while loading shared libraries: delforlazarus.so: cannot open shared object file: No such file or directory

Es funktioniert doch bei dir! Benenne 'delforlazarus.so" in deinem Code in "libdelforlazarus.so" um. Dann noch das so-file nach /usr/lib - Fertig! (oder einen Symlink nach /usr/lib)

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1496
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Library einbinden ...

Beitrag von corpsman »

Also,

Tatsache.

Das man die Library in "lib<name>.so" umbenennen mus, das hatte ich mittlerweile auch erfahren.

und diese komische *.lrs datei braucht man zum Glück auch nicht, zumindest gehts bei mir nun auch ohne...

Es war Tatsächlich notwendig die *.so Datei ins /usr/lib/ Verzeichniss zu kopieren => Schade das man die nicht im binary Verzeichniss liegen lassen kann.

Das mit dem Symlink ist zwar ne nette sache, aber irgendwie auch nicht das gelbe vom Ei.

So mus ich für meine Programme zukünftig einen "installer" schreiben, der entweder die .so files kopiert ( was wohl schwierig sein wird , wegen der fehlenden Root Rechte ), oder kann man mit TProgress den Symlink selbst setzen ?

Na egal wie, vielen Dank dir und euch, das Problem ist gelöst ;). THX
--
Just try it

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

Re: Library einbinden ...

Beitrag von theo »

Afaik kann man auch ein Startscript schreiben:

Code: Alles auswählen

#!/bin/bash
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:<Mein Pfad zur *.so>
MeinAnwendungsPfad

Antworten