WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Erstelle Mex File mit Linux bibs, Crosscompiling

 

Scriptor
Forum-Century

Forum-Century


Beiträge: 217
Anmeldedatum: 22.02.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.02.2011, 13:38     Titel: Erstelle Mex File mit Linux bibs, Crosscompiling
  Antworten mit Zitat      
Sehr geehrte Community,

In meinen aktuellen eigenen Projekten habe ich mich wirklich durch ein Thema gequält, was mich viel Zeit gekostet hat. Deswegen möchte ich einen kurzen Leitfaden dazu geben, wie man eigene Quelltexte in Linux erstellt und nach Windows portiert. Dies ist nur ein Weg, den man einschlagen kann, denn es gibt bestimmt noch andere.

Ich habe diesen kleinen Quelltext, der in Linux wunderbar läuft und möchte, dass er so wie er ist auf Windows zum laufen gebracht wird:


Code:

#include <stdlib.h>
#include <math.h>
#include <complex.h>
#include "c:\MinGW\fftwdir\include\fftw3.h"

#include <matrix.h>
#include <mex.h>  

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{

  double *i1      = mxGetPr(prhs[0]);
 
 
  int N = mxGetN(prhs[0]), h = 0;
  mexPrintf("\n\n%i\n\n",N);
  fftw_complex *in, *out;
  fftw_plan p;
 
  in = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N);
  out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N);
  p = fftw_plan_dft_1d(N, in, out, FFTW_FORWARD, FFTW_ESTIMATE);
 
  if(mxIsComplex(prhs[3]))
  {
    double *i2      = mxGetPi(prhs[0]);
    for(h = 0; h < N; h++)
      in[h] = i1[h] + I*i2[h];
  }
  else
    for(h = 0; h < N; h++)
        in[h] = i1[h] + I*0;
 
  fftw_execute(p); /* repeat as needed */
 
  for( h = 0; h < N; h++)
      mexPrintf(" \n%3i. %6.4f %6.4f", h+1, creal(in[h]), cabs(out[h]));
 
  fftw_destroy_plan(p);
  fftw_free(in); fftw_free(out);
}
 


Dabei müssen wir die verschiedenen bibliotheken aber ebenso unter Windows nutzbar machen. Die stdlib, math und complex.h sind gcc Standardbibliotheken. Daher braucht man den MinGW, der diese Bibliotheken ebenso enthält, um nicht sich qualvoll selber solche Libs zu schreiben oder irgendwelche Alternativen zu suchen. Angeblich sollen mit MinGW erstellte Mex Files sogar schlanker sein als Compilate anderer Compiler.

Erster Schritt: Man lädt sich die entsprechenden Source Codes runter.

und zwar hier

Und entpackt sie, öffnet die MSYS Konsole des MinGW und wechselt mit
bespielsweise:

Code:
cd c:/MinGW/fftw-3.2.2


in den entpackten Ordner und gibt ein:

Code:
./configure  --with-our-malloc16  --enable-shared  --enable-portable-binary --enable-sse2  --prefix=c:/MinGW/fftwdir


Jede Linux Bibliothek hat ein Configurationscript, was aufgerufen wird um Parameter die zum Aufbauen der Bibliothek benötigt werden festzulegen und die enthaltenen Daten für das OS (in unserem Fall win32) bereitzustellen, die mit dem Befehl

Code:


entsprechend umgewandelt werden um dann zum Schluss mit

Code:
make install


installiert werden. Für die meisten bibliotheken und Anwendungen unter Linux reicht in der Regel der
Code:
./configure
. Für die Installation auf MinGW werden jedoch diese einzelnen Variablen an den configure Befehl angehängt.Diese kann man auf der fftw HP entnehmen. Mit dem Prefix am Ende des congiguration Befehls, legt man den Installationsordner fest. In diesen wechseln wir nun mit:

Code:
cd c:/MinGW/fftwdir


In diesem befinden sich nun vier verschiedene Ordner. Interessieren tun aber nur 2 und zwar der include und der bin order. Im ersten befindet sichder Header und im zweiten die entsprechende DLL. Mit normalen Anwendungen reicht das schon,für Matlab benötigen wir aber die statische Import Lib mit Dateiendung ".lib" und die .dll.

Wir wechseln in den bin Ordner mit

Code:


und packt die pexports binary (aus der angehangen .zip) mit rein. und zieht aus der .dll mit pexports erstmal die entsprechende .def mit der man aus der .dll die .lib erstellt:

Code:

pexports libfftw3-3.dll > libfftw3-3.def
dlltool --input-def  libfftw3-3.def –dllname  libfftw3-3.dll --output-lib libfftw3-3.lib -k
 


Nun müsste sich im Ordner die .lib befinden, die wir brauchen. Dennoch sind wir nicht ganz durch. Wir laden uns als nächstes Gnumex von der sourceforge runter und entpacken ihn. Den entstandenen Ordner fügen Wir nun zu den bekannten Matlab Ordern hinzu und geben in die Matlab Konsole gnumex ein. Es müsste sich ein Fenster öffnen.

Man muss eig nix tun, als sich den Pfad zu einer entstanden mexopts.bat Datei merken, was mit strg + c gemacht wird und erstellt die mexopts.bat datei. Dieser ist die Brücke zwischen MinGW und Matlab.

Nun können wir einfach kompilieren mit:

Code:
mex -f       ***bat-Datei-Pfad***\mexopts.bat    fftmex.c  libfftw3-3.lib  


Ich habe einfach beides .lib und .dll in den aktuellen matlab ordner gepackt und den Header Pfad im c-File mit eingebracht.

Bei mir hats gefunzt. Bitte prüft mal, ob das so läuft. Bitte stellt ansonsten Fragen.

Mfg Icke
Private Nachricht senden Benutzer-Profile anzeigen


Arnox
Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 27.02.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.02.2011, 20:09     Titel:
  Antworten mit Zitat      
Danke schonmal für die Anleitung!
Ich stecke gerade bei pexports fest, wo bekommt man den da dass richtige Binary?
Und nur zum interesse wie kann man in der MINGW Konsole Befehle per Copy&Paste einfügen?

MfG Arne
Private Nachricht senden Benutzer-Profile anzeigen
 
Scriptor
Themenstarter

Forum-Century

Forum-Century


Beiträge: 217
Anmeldedatum: 22.02.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.02.2011, 21:05     Titel:
  Antworten mit Zitat      
Ich dachte ich hätte was angehangen, aahhh hab was vergessen zu drücken.in der Zip unten ist die binary im Ordner bin.


Copy and paste habe ich auch noch nciht rausgefunden.

Mfg Icke

pexports-0.43.zip
 Beschreibung:
Hier, dies in den Order auf den die MSYS Konsole zugreift:

Download
 Dateiname:  pexports-0.43.zip
 Dateigröße:  47.51 KB
 Heruntergeladen:  932 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Arnox
Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 27.02.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.03.2011, 11:31     Titel:
  Antworten mit Zitat      
Ich habe das ganze mit MinGW jetzt leider aufgegeben, weil gnumex und 64 bit sicht nicht ohne weiteres vertragen:

http://sourceforge.net/tracker/inde....._id=93315&atid=603906

und

http://sourceforge.net/mailarchive/.....p;forum_name=gnumex-users

Habs leider nicht hinbekommen das gnumex richtig funktioniert Sad


PS: das Zeichen vor dllname soll ein > oder?!
Private Nachricht senden Benutzer-Profile anzeigen
 
Scriptor
Themenstarter

Forum-Century

Forum-Century


Beiträge: 217
Anmeldedatum: 22.02.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.03.2011, 15:26     Titel:
  Antworten mit Zitat      
Vll solltest die gewonnenen .dlls und die .lib vll mit anderen Kompilern nutzen. Soweit ich weiß, haben sie auch eine Schnittstellen-funktion zu anderen Kompilern. Kpf hoch, bei sowas ist man erst dann gescheitert, wenn man aufgibt.

also weitermachen und irgendwann wird es schon klappen.Probiere einfach mal ohne die mexopts aus, lass also den -f und die Angabe der.bat weg(den Pfad natürlich auch;)).

Mfg Icke
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.