[gelöst] MathGL über Free Pascal aufrufen

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Helios
Lazarusforum e. V.
Beiträge: 119
Registriert: Mi 29. Jun 2011, 22:36
OS, Lazarus, FPC: Lazarus 2.2.6 Windows 10 64Bit / Lazarus 2.0.12 Debian 11.7 „Bullseye" 64Bit
CPU-Target: 64Bit
Wohnort: Leonberg

[gelöst] MathGL über Free Pascal aufrufen

Beitrag von Helios »

Hallo Lazarus Gemeinde,
ich möchte gerne mathematische Funktionen in 3D plotten und hatte da schon seit einiger Zeit MathGL https://mathgl.sourceforge.net/ in Betracht gezogen. Hier scheint es schon mal in Vorgängerversionen "einbindbar" gewesen zu sein, siehe https://groups.google.com/g/mathgl/c/0XU6t04sni8.
Ich hab es auch selbst versucht, bekomme ein kompilierbares Pascal Programm auf Basis eines C Programmes ("mathgl_test.c") zusammen,
aber es fliegt mir mit einer "exception" zur Laufzeit um die Ohren.
Hat hier jemand es geschafft, ein lauffähiges Free Pascal/Lazarus Programm mit Einbindung von MathGL unter Windows (10) 64 Bit hin zu bekommen?
Ich wäre hier für jeden Tipp dankbar.
Danke und Gruß
Helios

PS: Die Datei "mgl_pas.pas" befindet sich in den Sourcen von MathGL. Die entsprechenden DLL's findet man (auch) hier https://mathgl.sourceforge.net/doc_en/Download.html
Dateianhänge
DrawSinCurve.zip
(18.4 KiB) 34-mal heruntergeladen
Zuletzt geändert von Helios am Do 20. Jun 2024, 00:54, insgesamt 1-mal geändert.

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

Re: MathGL über Free Pascal aufrufen

Beitrag von Mathias »

Hat hier jemand es geschafft, ein lauffähiges Free Pascal/Lazarus Programm mit Einbindung von MathGL unter Windows (10) 64 Bit hin zu bekommen?
Ich war gerade neugierig und habe geguckt, was dies ist und die Sourcen runtergeladen.
Unter Linux lies sich eine *.so bauen.
Aber leider ist das ganze mit C++ geschrieben, daher fast nicht möglich mit FPC einzubinden. Schade.
Da wird es eine Brücken-lib brauchen, so wie es bei QT der Fall ist.

Ausser es hat sich etwas geändert.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Helios
Lazarusforum e. V.
Beiträge: 119
Registriert: Mi 29. Jun 2011, 22:36
OS, Lazarus, FPC: Lazarus 2.2.6 Windows 10 64Bit / Lazarus 2.0.12 Debian 11.7 „Bullseye" 64Bit
CPU-Target: 64Bit
Wohnort: Leonberg

Re: MathGL über Free Pascal aufrufen

Beitrag von Helios »

Hallo Mathias,
danke für Deine Rückmeldung. Eigentlich sollte, lt. Entwickler vom MathGL, die Library auch für nicht objektorientierte Sprachen geeignet sein.
Zitat: "... MathGL drawing can be created not only by object oriented languages (like, C++ or Python), but also by pure C or Fortran-like languages. ..."
aus https://mathgl.sourceforge.net/doc_en/Basic-usage.html.
In dem oben genannten Link https://groups.google.com/g/mathgl/c/0XU6t04sni8, gab es noch folgendes Zitat:
"... I found the problem. Everything works ok with libmgl.dll for versions up to 2.3.1. For latest versions, 2.3.2 and 2.3.3, the mgl_create_graph function in Lazarus doesn't work."
Es war also die Rede davon, dass MathGL Version 2.3.1 und Lazarus/Delphi mal "zusammengespielt" haben. Ich bin schon an einer Neukompilation der Version 2.3.1 unter Win 10 mit mingw-gcc 64 Bit dran. Vielleicht klappt das ja doch irgendwie (evtl. auch mit Fortran? Da habe ich grade dran Geschmack gefunden, da die LAPACK, besser OpenBLAS Anbindung mit Lazarus klappt (freu!)). Wenn es funktioniert (wie auch immer) melde ich das hier zurück.
Wenn sonst noch jemand einen Tipp für mich hat, gerne her damit ;-)!
Danke nochmal und Gruß
Helios

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

Re: MathGL über Free Pascal aufrufen

Beitrag von Mathias »

Ich bin schon an einer Neukompilation der Version 2.3.1 unter Win 10 mit mingw-gcc 64 Bit dran
Dies habe ich auch hingekriegt.

Code: Alles auswählen

cmake -S ../mathgl-8.0.1/ -B .   --install-prefix ~/win64_local  -DCMAKE_CXX_COMPILER="/usr/bin/x86_64-w64-mingw32-g++"   -DCMAKE_C_COMPILER="/usr/bin/x86_64-w64-mingw32-gcc"   -DCMAKE_RC_COMPILER="/usr/bin/x86_64-w64-mingw32-windres"   -DCMAKE_FIND_ROOT_PATH="/usr/x86_64-w64-mingw32"   -DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE="BOTH"   -DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY="ONLY"   -DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM="BOTH"   -DCMAKE_SYSTEM_NAME="Windows" 
Da motzt er, das er Zlib und PNG nicht findet.

Code: Alles auswählen

-- Could NOT find ZLIB (missing: ZLIB_LIBRARY) (found version "1.2.11")
CMake Error at CMakeLists.txt:565 (message):
  Couldn't find ZLib library.


-- Could NOT find ZLIB (missing: ZLIB_LIBRARY) (found version "1.2.11")
-- Could NOT find PNG (missing: PNG_LIBRARY PNG_PNG_INCLUDE_DIR) 
CMake Error at CMakeLists.txt:592 (message):
  Couldn't find PNG library.
Da habe ich "cmake-gui ." aufgerufen und die Kreuze bei den beiden Option ZLib und PNG enfernt.
Dann [Configure] [Generate] geklickt, und Programm beendet.
Da kommt zwar noch ein Fehler, den habe ich aber ingnorierrt.
Dann 'make -j' und es hat frische DDLs gegeben.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: MathGL über Free Pascal aufrufen

Beitrag von Mathias »

Code: Alles auswählen

/*
  Linux:
 gcc main.c -o main -lmgl

  Windows:
  Folgende Dateien müssen im Stamm-Ordner des Projektes sein libgomp-1.dll + libmgl.dll. Oder in System32 
  x86_64-w64-mingw32-gcc main.c -o main.exe -lmgl -mwindows -I/usr/local/include -L.
*/

#include <mgl2/mgl_cf.h>
int main()
{
  HMGL gr = mgl_create_graph(600, 400);
  mgl_fplot(gr, "sin(pi*x)", "", "");
  mgl_write_frame(gr, "test.bmp", "");
  mgl_write_frame(gr, "test.svg", "");
  mgl_write_frame(gr, "test.png", "");
  mgl_delete_graph(gr);
}
Diese Programm lässt sich kompilieren. Wie erwartet, wir die PNG unter Windows nicht gebaut. Die habe ich ja mit "cmake-gui" deaktiviert.

So wie es aussieht, hat dies lib eine starke Ähnlichkeit mit Mathematica oder Matlab,

Da es mit C geht, müsste der Weg zu FPC gar nicht mehr so weit sein.
Dateianhänge
lib_mgl_test.zip
(1.74 MiB) 30-mal heruntergeladen
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: MathGL über Free Pascal aufrufen

Beitrag von Mathias »

Funktionieren tut es mit Pascal. :!:

Zuerst mal die Sourcen runterladen.
https://sourceforge.net/projects/mathgl ... r=deac-fra
Wen nötig mit den Sourcen die passenden *.DLL oder/und *.so bauen.

Bei den Sourcen findet man unter .../mathgl-8.0.1/include/mgl2/mgl_pas.pas sogar einen fast fertigen Pascal Header.

Folgende Zeilen musste ich ausklammern, da er die passenden libs nicht findet.
Mal gucken, ob man die auch noch bauen kann.

Code: Alles auswählen

//function mgl_create_graph_gl(): HMGL; cdecl; external libmgl;
//function mgl_create_graph_glut(draw: TMglDrawFunction; const title: PChar; par: pointer): HMGL; cdecl; external libmglglut;
//function mgl_create_graph_fltk(draw: TMglDrawFunction; const title: PChar; par: pointer): HMGL; cdecl; external libmglfltk;
//procedure mgl_fltk_run(); cdecl; external libmglfltk;
//function mgl_create_graph_qt(draw: TMglDrawFunction; const title: PChar; par: pointer): HMGL; cdecl; external libmglqt;
//procedure mgl_qt_run(); cdecl; external libmglqt;
Fast zu unterst muss noch dies rein.

Code: Alles auswählen

{$IFDEF Linux}
implementation
{$ENDIF}
Muss mal gucken, evtl kann man die Windows-Zeilen auch für Lazarus nutzen.
Aber die sind sowieso Grottenlangsam mit "canvas.Pixels" `
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: MathGL über Free Pascal aufrufen

Beitrag von Mathias »

Das wichtigste noch, das Pascal Code.
Ohne SetExceptionMask knallt es, so wie es bei GTKx auch der Fall ist.

Code: Alles auswählen

program project1;

uses
  Math,
  mgl_pas;

  procedure main;
  var
    gr: HMGL;
  begin
    gr := mgl_create_graph(600, 400);
    mgl_fplot(gr, 'sin(pi*x)', '', '');
    mgl_write_frame(gr, 'test.bmp', '');
    mgl_write_frame(gr, 'test.svg', '');
    mgl_write_frame(gr, 'test.png', '');
    mgl_delete_graph(gr);
  end;

begin
  SetExceptionMask([exDenormalized, exInvalidOp, exOverflow, exPrecision, exUnderflow, exZeroDivide]);
  main;
end.              
Zuerst dachte ich, das folgende procedure SetExceptionMask ersetzt, aber leider geht es nicht.

Code: Alles auswählen

var _FPUCW: word;
procedure mgl_begin();
 begin
  _FPUCW := Get8087CW();     // backup current FPU CW
  Set8087CW(_FPUCW or $3F); // masking all FPU exceptions
 end;
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Helios
Lazarusforum e. V.
Beiträge: 119
Registriert: Mi 29. Jun 2011, 22:36
OS, Lazarus, FPC: Lazarus 2.2.6 Windows 10 64Bit / Lazarus 2.0.12 Debian 11.7 „Bullseye" 64Bit
CPU-Target: 64Bit
Wohnort: Leonberg

Re: MathGL über Free Pascal aufrufen

Beitrag von Helios »

Hallo Mathias,
boah, super! Vielen Dank! Tatsächlich löst

Code: Alles auswählen

SetExceptionMask([exDenormalized, exInvalidOp, exOverflow, exPrecision, exUnderflow, exZeroDivide])
das/mein Problem!
Jetzt komme ich hier wieder weiter, prima!
Die DLL Libraries liegen ja alle unter https://mathgl.sourceforge.net/doc_en/Download.html für 32 und 64 Bit. Hattest Du das gesehen?
Ich habe es noch nicht geschafft alle DLL's, die dort angegeben sind, aus den (sorry C/C++) Sourcen zu erstellen.
Das Problem mit den ZLIB_LIBRARY und PNG_LIBRARY habe unter Windows 10 64Bit umgangen, indem ich MSYS2 (UCRT64) https://www.msys2.org verwendet habe.

Zum Aufsetzen der Win 64 Kompilierungsumgebung habe ich in meinem Fall folgende Schritte unternommen:
// MSYS2 von https://www.msys2.org installieren, Download: msys2-x86_64-20240507.exe
// MSYS2 UCRT Umgebung starten
// Hier jetzt die eingabe auf der MSYS URCT Konsole
pacman -Suy
pacman -S mingw-w64-ucrt-x86_64-gcc
pacman -S mingw-w64-ucrt-x86_64-make
pacman -S mingw-w64-ucrt-x86_64-cmake
pacman -S mingw-w64-ucrt-x86_64-toolchain
// Dann sind die ZLIB und PNG Libraries zum compilieren vorhanden:
pacman -S mingw-w64-ucrt-x86_64-mathgl
// mathgl-8.0.1.tar.gz von http://downloads.sourceforge.net/mathgl ... 0.1.tar.gz besorgt und unter home (~) als mathgl-8.0.1 entpackt
cd ~/mathgl-8.0.1
// Mit CMake den Build Prozess konfigurieren und starten
cmake -G "MinGW Makefiles" -DBUILD_SHARED_LIBS:BOOL=ON -S . -B "build64"
cmake --build build64 --config Release

Unter ~\mathgl-8.0.1\build64\src befindet sich dann zumindest mal die libmgl.dll (hat aber Probleme mit PNG bei der Ausführung
und daher muss ich nochmal schauen wie alle anderen DLL's erstellt werden. SVG und BMP sind aber i.O ...)

Vielen Dank nochmal für Deine Hilfe und Grüße
Helios

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

Re: [gelöst] MathGL über Free Pascal aufrufen

Beitrag von Mathias »

Zum Aufsetzen der Win 64 Kompilierungsumgebung habe ich in meinem Fall folgende Schritte unternommen:
// MSYS2 von https://www.msys2.org installieren, Download: msys2-x86_64-20240507.exe
Die habe ich auch schon probiert. Auf dem Laptop mit wine-stable bricht die Installation schon beim Start ab.
Auf dem PC mit dem neusten Wine, läuft die Installation bis 50% und bleibt hängen. :roll:
In der VB mit Win10 habe ich es auch probiert. Die Installation läuft dort durch. Aber bei "pacman" geht es nicht mehr weiter.
Unter ~\mathgl-8.0.1\build64\src befindet sich dann zumindest mal die libmgl.dll (hat aber Probleme mit PNG bei der Ausführung
und daher muss ich nochmal schauen wie alle anderen DLL's erstellt werden. SVG und BMP sind aber i.O ...)
Genau, soweit bin ich auch gekommen. Die 2. DLL dies es in meinem Anhang weiter oben hat, habe ich runter geladen.
Unter Linux geht alles einwandfrei.

Was ich noch den Eindruck hab, dem fertigen Pascal-Header fehlen einige Funktionen. Der ist wohl nicht mehr auf dem neusten Stand.
Oder sie sind nur der C++-Version vorbehalten.

boah, super! Vielen Dank! Tatsächlich löst

Code: Alles auswählen

SetExceptionMask([exDenormalized, exInvalidOp, exOverflow, exPrecision, exUnderflow, exZeroDivide])
das/mein Problem!
Dies ist echt ein lästiges Problem von FPC.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Helios
Lazarusforum e. V.
Beiträge: 119
Registriert: Mi 29. Jun 2011, 22:36
OS, Lazarus, FPC: Lazarus 2.2.6 Windows 10 64Bit / Lazarus 2.0.12 Debian 11.7 „Bullseye" 64Bit
CPU-Target: 64Bit
Wohnort: Leonberg

Re: [gelöst] MathGL über Free Pascal aufrufen

Beitrag von Helios »

Hallo Mathias,
da ich nicht alle DLL's (sondern nur eine kleine Untermenge) unter Win 10 64 erzeugen konnte, habe ich es mal unter Debian Linux (11-Bullseye) probiert.
Da laufe ich aber auch in einige Probleme mit dem Aufruf mit cmake rein. Welche Linux Distribution hattest Du oben bei dem Erzeugen der *.so verwendet?
Gruß
Helios

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

Re: [gelöst] MathGL über Free Pascal aufrufen

Beitrag von Mathias »

Welche Linux Distribution hattest Du oben bei dem Erzeugen der *.so verwendet?
Linux Mint 64bit
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Helios
Lazarusforum e. V.
Beiträge: 119
Registriert: Mi 29. Jun 2011, 22:36
OS, Lazarus, FPC: Lazarus 2.2.6 Windows 10 64Bit / Lazarus 2.0.12 Debian 11.7 „Bullseye" 64Bit
CPU-Target: 64Bit
Wohnort: Leonberg

Re: [gelöst] MathGL über Free Pascal aufrufen

Beitrag von Helios »

Hallo Mathias,
vielen Dank nochmal für Deine Unterstützung. Jetzt hat der Build der MathGL Libraries unter Linux (Debian 12/Bookworm) geklappt.
Wenn die *.so's/*.dll's zur Verfügung stehen, funktioniert auch der Start der MathGL Applikationen im Anhang direkt aus der Lazarus IDE heraus (Debugger deaktiviert, sonst kracht es bei der Ausführung wahrscheinlich aufgrund der Exception die wir ja mit SetExceptionMask bewusst ausblenden).
Im Anhang jetzt die besagten zwei Projekte, die unter Win 10 64Bit und Debian 12 compilieren und sich auch entsprechend aus der IDE ausführen lassen, wenn die MathGL Libraries (wie gesagt) im PATH (Win) oder im LD_LIBRARY_PATH (Linux) sind.
Die Windows Executables laufen auch unter wine in Debian. Ich glaube damit können wir die Anfrage hier sauber abschließen. Die vollständige Compilation der MathGL DLL unter Windows 64 ist ein anderes Thema, das ist dann rein MathGL spezifisch und dort in deren Newsgroup sicher besser aufgehoben :D .
Nochmal Danke für den Tipp mit der SetExceptionMask, das war hier der Durchbruch!!!
Gruß
Helios
Dateianhänge
MathGLChapter2_5.png
MathGLChapter2_5.png (305.69 KiB) 1823 mal betrachtet
MathGLChapter2_5.zip
(18.51 KiB) 33-mal heruntergeladen
MathGLChapter2.zip
(18.15 KiB) 32-mal heruntergeladen

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

Re: [gelöst] MathGL über Free Pascal aufrufen

Beitrag von Mathias »

Im Anhang jetzt die besagten zwei Projekte, die unter Win 10 64Bit und Debian 12 compilieren und sich auch entsprechend aus der IDE ausführen lassen
Du sagst, sie Beispiel im Anhang laufen auch unter Debian. Ich wollte es testen, aber er motzt bei mir bei diesen libs, schon wie oben beschrieben.

Code: Alles auswählen

libmglglut = 'libmgl-glut.so';
libmglfltk = 'libmgl-fltk.so';
libmglqt   = 'libmgl-qt.so';
Von wo hast du diese, respektive wie hast du die gebaut ?
Die vollständige Compilation der MathGL DLL unter Windows 64 ist ein anderes Thema, das ist dann rein MathGL spezifisch und dort in deren Newsgroup sicher besser aufgehoben :D .
Mich interessiert solches momentan auch stark, da ich auch versuche Pakete von Linux aus für Windows zu übersetzen.
Aus jedem Tip und Beispiel lernt man wieder neues.


Auch die MathGL sieht vielversprechend aus, die muss ich mir mal genauer angucken.

Nur wen ich da rein gucke sieht es leider aus, das dieses Paket nicht mehr so stark gepflegt wird. https://mathgl.sourceforge.net/doc_en/News.html
Vor fast 2½ Jahren die letzte Änderung
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Helios
Lazarusforum e. V.
Beiträge: 119
Registriert: Mi 29. Jun 2011, 22:36
OS, Lazarus, FPC: Lazarus 2.2.6 Windows 10 64Bit / Lazarus 2.0.12 Debian 11.7 „Bullseye" 64Bit
CPU-Target: 64Bit
Wohnort: Leonberg

Re: [gelöst] MathGL über Free Pascal iaufrufen

Beitrag von Helios »

Hallo Mathias,
ich habe grade kein Linux Rechner im Zugriff.
Probier es mal mit
cmake -S . -B ./build64 -D enable-all=on -D enable-all-widgets=on
auf der Ebene der Haupt CMakeList.txt von den Sourcen, gefolgt von einen
cmake -build ./build64
und nach Erfolg
cmake -build -t install
um die (hoffentlich) erstellten *.so‘s in die Standardverzeichnisse zu kopieren.
Sobald ich an einen entsprechenden Rechner komme bestätige ich die Vorgehensweise nochmal. Ich hatte auch andere -D enable* Einstellungen versucht, die liefen aber leider immer wieder auf Probleme hinaus (massiv im Win 10 64bit letztendlich hatte ich es da dann aufgegeben und dann Glück unter Debian gehabt) z. B. mit hdf4.
Obwohl ich mit
sudo apt-get install hdf (usw) eigentlich hätte alles zum builden installiert haben müssen. Ich wünsche Dir da mehr Glück😉.
Gruß
Helios

Helios
Lazarusforum e. V.
Beiträge: 119
Registriert: Mi 29. Jun 2011, 22:36
OS, Lazarus, FPC: Lazarus 2.2.6 Windows 10 64Bit / Lazarus 2.0.12 Debian 11.7 „Bullseye" 64Bit
CPU-Target: 64Bit
Wohnort: Leonberg

Re: [gelöst] MathGL über Free Pascal aufrufen

Beitrag von Helios »

Hallo Mathias,
das oben gesagte war fast richtig, allerdings habe ich die Version aus Subversion geholt und nicht das mathgl-8.0.1.tar.gz aus dem Download, also wie folgt:

svn checkout http://svn.code.sf.net/p/mathgl/code/mathgl-2x mathgl-code
cd mathgl-code
cmake -S . -B ./build -Denable-all=on -Denable-all-widgets=on
cmake --build build

dann gecheckt ob *.so Libraries erstellt wurden mit
find . -name "*.so"
Ergebnis:
./build/examples/libmgl_module.so
./build/src/libmgl.so
./build/widgets/libmgl-fltk.so
./build/widgets/qt5/libmgl-qt5.so
./build/widgets/qt5/libmgl-qt.so
./build/widgets/libmgl-wnd.so
./build/widgets/libmgl-wx.so
./build/widgets/libmgl-glut.so


Und wenn man sich dann sicher ist, dass man die Libraries im System installiert haben will, kann man diesen Befehl absetzen:
sudo cmake --build build -t install

So müsste es passen, hab es grade nochmal ausprobiert.
Gruß
Helios

Antworten