Wie ALGlib einbinden?

Zur Vorstellung von Komponenten und Units für Lazarus
Antworten
Benutzeravatar
photor
Beiträge: 443
Registriert: Mo 24. Jan 2011, 21:38
OS, Lazarus, FPC: Arch Linux: L 2.2.6 FPC 3.2.2 (Gtk2)
CPU-Target: 64Bit

Wie ALGlib einbinden?

Beitrag von photor »

Hallo Forum,

auf der Suche nach einer numerischen Bibliothek für Lazarus bin ich auf ALGlib (http://www.alglib.net/) gestoßen worden.Das passende (leider nicht ganz aktuelle) ZIP-File (alglib-2.6.0.freepascal.zip) habe ich runtergeladen und entpackt. Allerdings habe ich noch keine Ahnung, wie ich diese Lib nun kompilieren und in meine Programme einbinden soll (außer vielleicht jedesmal die entsprechenden Units in mein Projekt zu kopieren und mit zu übersetzen).

Hat jemand einen Tipp für einen Lazarusneuling.

Ciao,

Photor

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Wie ALGlib einbinden?

Beitrag von pluto »

Es müsste eine Beschreibung geben wie in etwa Install.txt oder so ähnlich. Ich kenne die LIB jetzt nicht, aber meistens liegt sowas dabei. Oder eine Readme.
MFG
Michael Springwald

indianer-frank
Beiträge: 134
Registriert: So 30. Nov 2008, 21:53

Re: Wie ALGlib einbinden?

Beitrag von indianer-frank »

Wo ist das Problem? Du packst doch (hoffentlich!?) auch nicht alle benötigten FPC-Sourcen in Dein Quellcodeverzeichnis. Hab das Archiv mal kurz gesaugt und nach c:\tmp ausgepackt. Das kleine Testprogramm (im Verzeichnis C:\Test) zB für die Gammafunktion kann dann

Code: Alles auswählen

program gt;
uses
  gammafunc;
begin
  writeln(gamma(1.5));
end.

mit FPC zB wie folgt kompiliert werden:

Code: Alles auswählen

fpc -FuC:\TMP\freepascal\src GT.PAS
C:\TEST>D:\FPC242\bin\i386-win32\fpc.exe -FuC:\TMP\freepascal\src GT.PAS
Free Pascal Compiler version 2.4.2 [2010/11/10] for i386
Copyright (c) 1993-2010 by Florian Klaempfl
Target OS: Win32 for i386
Compiling GT.PAS
Compiling C:\TMP\freepascal\src\gammafunc.pas
Compiling C:\TMP\freepascal\src\ap.pas
Linking GT.exe
1093 lines compiled, 3.6 sec , 59152 bytes code, 12984 bytes data

Es liefert das richtige Ergebnis 8.86226925452758E-001. In Lazarus muss man doch auch andere Unitverzeichnisse (wie mit dem FPC switch -Fu einstellen können, notfalls die cfg-Dateien anpassen).

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

Re: Wie ALGlib einbinden?

Beitrag von photor »

indianer-frank hat geschrieben:Wo ist das Problem? Du packst doch (hoffentlich!?) auch nicht alle benötigten FPC-Sourcen in Dein Quellcodeverzeichnis. Hab das Archiv mal kurz gesaugt und nach c:\tmp ausgepackt. Das kleine Testprogramm (im Verzeichnis C:\Test) zB für die Gammafunktion kann dann

Code: Alles auswählen

program gt;
uses
  gammafunc;
begin
  writeln(gamma(1.5));
end.

mit FPC zB wie folgt kompiliert werden:

Code: Alles auswählen

fpc -FuC:\TMP\freepascal\src GT.PAS
C:\TEST>D:\FPC242\bin\i386-win32\fpc.exe -FuC:\TMP\freepascal\src GT.PAS
Free Pascal Compiler version 2.4.2 [2010/11/10] for i386
Copyright (c) 1993-2010 by Florian Klaempfl
Target OS: Win32 for i386
Compiling GT.PAS
Compiling C:\TMP\freepascal\src\gammafunc.pas
Compiling C:\TMP\freepascal\src\ap.pas
Linking GT.exe
1093 lines compiled, 3.6 sec , 59152 bytes code, 12984 bytes data

Es liefert das richtige Ergebnis 8.86226925452758E-001. In Lazarus muss man doch auch andere Unitverzeichnisse (wie mit dem FPC switch -Fu einstellen können, notfalls die cfg-Dateien anpassen).


Hallo Indianer-Frank,

ich hatte jetzt eher erwartet, dass eine Lib erstellte wird (libalglib.so unter Linux z.B.). So, wie du das beschreibst packe ich die Sourcen der Lib irgendwo hin und gebe nur den Pfad in der Config-Datei (.cfg) an, so dass die Sourcen (Units) gefunden werden, die dann in das Executable gelinkt werden. Ist das richtig so?

Ok. Anderes Konzept als ich (bisher) kannte. Dann versuche ich das mal (sorry für den Trafic, aber bin Anfänger was Lazarus und FPC angeht).

Ciao,

Photor

indianer-frank
Beiträge: 134
Registriert: So 30. Nov 2008, 21:53

Re: Wie ALGlib einbinden?

Beitrag von indianer-frank »

photor hat geschrieben:...ich hatte jetzt eher erwartet, dass eine Lib erstellte wird (libalglib.so unter Linux z.B.). So, wie du das beschreibst packe ich die Sourcen der Lib irgendwo hin und gebe nur den Pfad in der Config-Datei (.cfg) an, so dass die Sourcen (Units) gefunden werden, die dann in das Executable gelinkt werden. Ist das richtig so?

Ok. Anderes Konzept als ich (bisher) kannte. Dann versuche ich das mal (sorry für den Trafic, aber bin Anfänger was Lazarus und FPC angeht).

Ja so würde ich es machen. Allerdings: Lazarus benutze ich dar nicht, FPC nur um meine allgemeine Pascalsoftware (unter Windows) auf Kompatibilität zu testen. Es gibt noch weitere Möglichkeiten numerische Software als Library einzubinden: Ich habe zB schon die GSL unter FreePascal getestet http://sites.google.com/site/3kvarka/gsl-pascal/ und ein Kurzgoogeln scheint auch was für Lazarus zu entdecken, zB http://www.lazarus.freepascal.org/index.php?topic=11451.0. Ob das alles zB unter Linux läuft, kann ich leider nicht sagen.

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

Re: Wie ALGlib bzw. C-Library einbinden?

Beitrag von photor »

indianer-frank hat geschrieben:Es gibt noch weitere Möglichkeiten numerische Software als Library einzubinden: Ich habe zB schon die GSL unter FreePascal getestet http://sites.google.com/site/3kvarka/gsl-pascal/ und ein Kurzgoogeln scheint auch was für Lazarus zu entdecken, zB http://www.lazarus.freepascal.org/index.php?topic=11451.0. Ob das alles zB unter Linux läuft, kann ich leider nicht sagen.


Danke für den Hinweis auf die GSL. Das sieht richtig gut aus; enthält wohl alles, was man in der Numerik jemals braucht. :D (bisher nicht angeschaut, weil keine Pascal-Lib; wusste nicht, dass es eine Pascal-Adaption gibt).

Jetzt muss ich nur noch raus bekommen, wie ich die Library richtig einbinde:
  • http://sites.google.com/site/3kvarka/gsl-pascal/ habe ich gesaugt und in mein HOME entpackt
  • das Directory enthält eine gsl.pas-Datei, die einige Definitionen mathematischer Konstanten, Error-Codes und die Prototypen (C-Sprech) der Funktionen und Prozeduren enthält
  • im System ist das GSL-Packages installiert (Debian-Gnu/Linux); die .so-Dateien sind unter/usr/lib/libgsl.so.0 zu finden

Jetzt ist die Frage: wo muss ich Lazarus was mitteilen/einstellen, damit ich diese Library in meinen Programmen/Projekten nutzen kann? Wäre schön, wenn mir jemand ein paar Tipps geben kann (die wahrscheinlich für alle C-Libs gelten, die man einbinden will).Dankbar für jede Hilfe.

Ciao,

Photor

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Wie ALGlib einbinden?

Beitrag von pluto »

Du muss "nur" die Pfade, wenn es keine LPK Datei gibt, in dein Projekt eintragen. Unter Compilier\Compilier Einstellungen findest du alles. Meistens gibt es ein Verzeichnis SRC oder Soruce oder so ähnlich. Das ist immer unterschiedlich.
MFG
Michael Springwald

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

Re: Wie externe Library einbinden?

Beitrag von photor »

pluto hat geschrieben:Du muss "nur" die Pfade, wenn es keine LPK Datei gibt, in dein Projekt eintragen. Unter Compilier\Compilier Einstellungen findest du alles. Meistens gibt es ein Verzeichnis SRC oder Soruce oder so ähnlich. Das ist immer unterschiedlich.


Moin,

ich experimentiere gerade mit der gsl. Ich habe erstmal einfach

Code: Alles auswählen

uses
  gsl

in eine unit eingebaut, ohne weiter auf die libgsl zuzugreifen. Ich hätte jetzt auch nicht gedacht, dass das Projekt compiliert. Ich erhalte folgendes:

Code: Alles auswählen

/usr/bin/ld: warning: /home/photor/Lazarus/Projekt1/link.res contains output sections; did you forget -T?
/usr/bin/ld: cannot find -lmsvcrt.dll
suzfrac.lpr(21,1) Error: Error while linking
suzfrac.lpr(21,1) Fatal: There were 1 errors compiling module, stopping

Was mich wundert, ist der Verweis auf die msvcrt.dll. Ich habe hier ein Linux-System, das diese dll bestimmt nicht besitzt.

In der gsl.pas habe ich tatsächlich zwei extern deklarierte Funktionen (fclose und fopen) gefunden, die auf die msvcrt verweisen. Aber selbst wenn ich diese beiden auskommentiere, bleibt die Fehlermeldung die gleiche :shock:
Auch rumspielen mit den von dir vorgeschlagenen Einstellungen ändert nichts. :o

Gibt es eine Anleitung, HowTo, wie man eine externe Lib (hier auch noch eine C-Lib) ordnungsgemäß unter Lazarus einbindet? Wo muss ich was genau einstellen, damit der Compiler und Linker alles richtig findet?

Ciao,

Photor

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: Wie externe Library einbinden?

Beitrag von Maik81ftl »

photor hat geschrieben:
pluto hat geschrieben:Du muss "nur" die Pfade, wenn es keine LPK Datei gibt, in dein Projekt eintragen. Unter Compilier\Compilier Einstellungen findest du alles. Meistens gibt es ein Verzeichnis SRC oder Soruce oder so ähnlich. Das ist immer unterschiedlich.


Moin,

ich experimentiere gerade mit der gsl. Ich habe erstmal einfach

Code: Alles auswählen

uses
  gsl

in eine unit eingebaut, ohne weiter auf die libgsl zuzugreifen. Ich hätte jetzt auch nicht gedacht, dass das Projekt compiliert. Ich erhalte folgendes:

Code: Alles auswählen

/usr/bin/ld: warning: /home/photor/Lazarus/Projekt1/link.res contains output sections; did you forget -T?
/usr/bin/ld: cannot find -lmsvcrt.dll
suzfrac.lpr(21,1) Error: Error while linking
suzfrac.lpr(21,1) Fatal: There were 1 errors compiling module, stopping

Was mich wundert, ist der Verweis auf die msvcrt.dll. Ich habe hier ein Linux-System, das diese dll bestimmt nicht besitzt.

In der gsl.pas habe ich tatsächlich zwei extern deklarierte Funktionen (fclose und fopen) gefunden, die auf die msvcrt verweisen. Aber selbst wenn ich diese beiden auskommentiere, bleibt die Fehlermeldung die gleiche :shock:
Auch rumspielen mit den von dir vorgeschlagenen Einstellungen ändert nichts. :o

Gibt es eine Anleitung, HowTo, wie man eine externe Lib (hier auch noch eine C-Lib) ordnungsgemäß unter Lazarus einbindet? Wo muss ich was genau einstellen, damit der Compiler und Linker alles richtig findet?

Ciao,

Photor


kenn ich die Fehlermeldung.

gibt 3 wege die richtig zu laden. eine davon braucht allerdings die "dl_close.c"

die 2te, ist eine Änderung der "ld.so.conf.", welche sich z.B, bei Ubuntu in "/etc" befindet

die 3te ist das kopieren der "so" in das lib verzeichnis deines Rechners.

ich selber habe 2 mgl's angewendet. 1) änderung der ld.so.conf inkl. eigener Conf mit privater Libsammlung und 2) so in's libverzeichnis kopiert sowie in das verzeichnis, wo diese von den Projekten verwendet werden.

Näher ist ein einem der Foremthemen von mir zu finden.

sollte es bei dir ebenfalls um Dlls / so genau gehen schau bitte HIER :!:
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Wie ALGlib einbinden?

Beitrag von pluto »

Bei mir war das einmal so, dass ich die DLL manuell angepasst habe und statt .dll dann halt .so in der LIB geschrieben habe(War die VLC-Lib).
MFG
Michael Springwald

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: Wie ALGlib einbinden?

Beitrag von Maik81ftl »

wenn man's so nimmt is das ein und das selbe, nur das eine andere Endung dahinter läuft.
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

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

Re: Wie externe Library einbinden?

Beitrag von photor »

Maik81ftl hat geschrieben:kenn ich die Fehlermeldung.

gibt 3 wege die richtig zu laden. eine davon braucht allerdings die "dl_close.c"

die 2te, ist eine Änderung der "ld.so.conf.", welche sich z.B, bei Ubuntu in "/etc" befindet

die 3te ist das kopieren der "so" in das lib verzeichnis deines Rechners.

ich selber habe 2 mgl's angewendet. 1) änderung der ld.so.conf inkl. eigener Conf mit privater Libsammlung und 2) so in's libverzeichnis kopiert sowie in das verzeichnis, wo diese von den Projekten verwendet werden.

Näher ist ein einem der Foremthemen von mir zu finden.

sollte es bei dir ebenfalls um Dlls / so genau gehen schau bitte HIER :!:


Moin,

also ich bin weiter leicht verwirrt. Wenn ich das richtig verstanden habe, kann man eine externe (in C) geschriebene Bibliothek in Lazarus nutzen. Dazu wird mittels eines Tools (h2pas) aus den Header-Dateien der C-Library eine Unit gebaut, in der die Funktionsprototypen und wichtige Interface-Strukturen definiert werden.

Im Fall der GSL ist das offensichtlich gemacht worden. Jedenfalls gibt es in dem von Indianer-Frank angegebenen Paket eine entsprechende Datei gsl.pas.

Zusätzlich muss man dann wohl noch die eigentliche Library im System vorhalten. Diese ist nicht im Paket enthalten. Auf meinem System habe ich die entsprechenden Pakete installiert und die Libs befinden sich unter:

Code: Alles auswählen

/usr/lib/libgsl.a
/usr/lib/libgsl.so
/usr/lib/libgsl.so.0
/usr/lib/libgsl.so.0.15.0
/usr/lib/libgslcblas.a
/usr/lib/libgslcblas.so
/usr/lib/libgslcblas.so.0
/usr/lib/libgslcblas.so.0.0.0

Diese Pfade sind dem System bekannt; es sucht alle seine Libs unter diesem (und anderen) Pfad:
ad 2: eine Anpassung von /etc/ld.conf sollte nach meinem Verständnis nicht nötig sein.
ad 3: die Lib befindet sich bereits im Lib-Verzeichnis

Was ich also suche, ist ein Weg die libgsl.{a,so} in meinem Lazarus Projekt zu nutzen.

Was ich noch nicht verstehe, ist:
  • warum meckert Lazarus immer noch das Fehlen der lmsvcrt an, obwohl ich in gsl.pas alle Einträge mit einem Hinweis darauf auskommentiert habe?
  • Wo muss ich überall die Verwendung der libgsl eintragen, damit der Compiler und der Linker die entsprechenden Einsprungpunkte findet?
  • Ich bin doch bestimmt nicht der erste, der sowas versucht. Gibt es kein HowTo? Hier im Wiki habe ich noch nicht viel gefunden - was an meiner ungeschickten Suche liegen kann.

Ich stöbere weiter im Forumsarchiv.

Ciao,

Photor

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: Wie externe Library einbinden?

Beitrag von Maik81ftl »

photor hat geschrieben:
Maik81ftl hat geschrieben:kenn ich die Fehlermeldung.

gibt 3 wege die richtig zu laden. eine davon braucht allerdings die "dl_close.c"

die 2te, ist eine Änderung der "ld.so.conf.", welche sich z.B, bei Ubuntu in "/etc" befindet

die 3te ist das kopieren der "so" in das lib verzeichnis deines Rechners.

ich selber habe 2 mgl's angewendet. 1) änderung der ld.so.conf inkl. eigener Conf mit privater Libsammlung und 2) so in's libverzeichnis kopiert sowie in das verzeichnis, wo diese von den Projekten verwendet werden.

Näher ist ein einem der Foremthemen von mir zu finden.

sollte es bei dir ebenfalls um Dlls / so genau gehen schau bitte HIER :!:


Moin,

also ich bin weiter leicht verwirrt. Wenn ich das richtig verstanden habe, kann man eine externe (in C) geschriebene Bibliothek in Lazarus nutzen. Dazu wird mittels eines Tools (h2pas) aus den Header-Dateien der C-Library eine Unit gebaut, in der die Funktionsprototypen und wichtige Interface-Strukturen definiert werden.

Im Fall der GSL ist das offensichtlich gemacht worden. Jedenfalls gibt es in dem von Indianer-Frank angegebenen Paket eine entsprechende Datei gsl.pas.

Zusätzlich muss man dann wohl noch die eigentliche Library im System vorhalten. Diese ist nicht im Paket enthalten. Auf meinem System habe ich die entsprechenden Pakete installiert und die Libs befinden sich unter:

Code: Alles auswählen

/usr/lib/libgsl.a
/usr/lib/libgsl.so
/usr/lib/libgsl.so.0
/usr/lib/libgsl.so.0.15.0
/usr/lib/libgslcblas.a
/usr/lib/libgslcblas.so
/usr/lib/libgslcblas.so.0
/usr/lib/libgslcblas.so.0.0.0

Diese Pfade sind dem System bekannt; es sucht alle seine Libs unter diesem (und anderen) Pfad:
ad 2: eine Anpassung von /etc/ld.conf sollte nach meinem Verständnis nicht nötig sein.
ad 3: die Lib befindet sich bereits im Lib-Verzeichnis

Was ich also suche, ist ein Weg die libgsl.{a,so} in meinem Lazarus Projekt zu nutzen.

Was ich noch nicht verstehe, ist:
  • warum meckert Lazarus immer noch das Fehlen der lmsvcrt an, obwohl ich in gsl.pas alle Einträge mit einem Hinweis darauf auskommentiert habe?
  • Wo muss ich überall die Verwendung der libgsl eintragen, damit der Compiler und der Linker die entsprechenden Einsprungpunkte findet?
  • Ich bin doch bestimmt nicht der erste, der sowas versucht. Gibt es kein HowTo? Hier im Wiki habe ich noch nicht viel gefunden - was an meiner ungeschickten Suche liegen kann.

Ich stöbere weiter im Forumsarchiv.

Ciao,

Photor


Hummel Hummel,

ausgehen von deiner Situation gehe ich wohl recht in der Annahme, das du dich ggf noch nicht mit Biblioteken befast hast, sry wenn ich mich da irren sollte.

wie gesagt! der erste wäre über diese Routine:

Code: Alles auswählen

var test : THandle;
begin
 
showmessage('start');
test := LoadLibrary(PChar(ExtractFilePath(ParamStr(0)) + '/usr/lib/libgsl.so'));
showmessage('mitte');
FreeLibrary(test);
showmessage('stop');


Diese habe ich auch über ein Forum gefunden, Kahm sogar über mein verlinkes Thema ein hinweis.
Diese geht bei mir jedoch nicht. da die dl_close.c nicht gefunden werden kann.


Variante 2).

Änderung der Conf.

1) Ja zu einem erfahrng und
2) das wissen, wo diese *.so-Dateien alle rumgeistern.

Hier ein Beispiel der von mir erstellten. Private lib.conf

Code: Alles auswählen

# Private Lib configuration
/home/maik81ftl/Programming/Regelkalender/lib


dazu die geänderte Quell-conf

Code: Alles auswählen

include /etc/ld.so.conf.d/*.conf
include /home/MAIK81FTL/*.conf    <<<--------- Eintrag meines Privaten conf-Verzeichnis


3te Variante

Code: Alles auswählen

{$IFDEF WIN32}
Function StrtoBin(Value: PChar):PChar; cdecl; External '\lib\libMyCode.dll'
{$ENDIF}
{$IFDEF LINUX}
Function StrtoBin(Value: PChar):PChar; cdecl; External '/libMyCode.so';   <<<--------- Kopie der eigendlichen Bibliotek immer in das Testverzeichnis und nach /usr/lib Kopiert
{$ENDIF}


ist im Übrigen teil des ersten Projektes, was plattformübergreifen laufen soll.

dahingehend, habe ich mich mit den varianten 2 und 3 angefreundet, auch wenn das etwas Umständlich ist.

sollte aber jemand wissen, wie man an die dl_close.c rankommt, bitte ich um wink mit lattenzaun. Danke :mrgreen:
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

Antworten