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

MEX-Dateien (C) - wie MEX-Kompilierung erkennen?

 

Nicolas S.
Forum-Century

Forum-Century


Beiträge: 146
Anmeldedatum: 15.07.09
Wohnort: ---
Version: R2014a/b
     Beitrag Verfasst am: 16.08.2012, 09:00     Titel: MEX-Dateien (C) - wie MEX-Kompilierung erkennen?
  Antworten mit Zitat      
Hallo zusammen,
ich bin gerade an C89-Code, der sowohl für MEX-Funktionen als auch für andere Zwecke bedingt kompiliert werden soll. Gibt es eine einfache Möglichkeit, Mex-Kompilierung automatisch zu erkennen, z.B. defines, die von Matlab gesetzt werden, z.B. so:
Code:

#ifdef MATLAB
  #include "mex.h"
   ...
#else
  #include <stdio.h>
   ....
#endif
 


Viele Grüße
Nicolas
_________________

--
The programmer suggested it.
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 17.08.2012, 21:31     Titel: Re: MEX-Dateien (C) - wie MEX-Kompilierung erkennen?
  Antworten mit Zitat      
Hallo Nicolas S.,

Code:
#ifdef MATLAB
  #include "mex.h"
   ...
#else
  #include <stdio.h>
   ....
#endif

Die funktioniert, wenn Du von Matlab aus so compilierts:
Code:
mex -O -DMATLAB func.c

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Nicolas S.
Themenstarter

Forum-Century

Forum-Century


Beiträge: 146
Anmeldedatum: 15.07.09
Wohnort: ---
Version: R2014a/b
     Beitrag Verfasst am: 20.08.2012, 08:20     Titel:
  Antworten mit Zitat      
Hallo Jan,
danke, das funktioniert prima!

Viele Grüße
Nicolas
_________________

--
The programmer suggested it.
Private Nachricht senden Benutzer-Profile anzeigen
 
flashpixx
Forum-Guru

Forum-Guru


Beiträge: 355
Anmeldedatum: 19.04.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.08.2012, 12:02     Titel: Re: MEX-Dateien (C) - wie MEX-Kompilierung erkennen?
  Antworten mit Zitat      
generell kann man auch den Compiler passend abfragen, siehe für die gängigsten Compiler: http://sourceforge.net/apps/mediawi.....index.php?title=Compilers

Matlab nutzt meines Wissens den installierten C/C++ Compiler für Mex, evtl kannst Du mal schauen, mit dem Verbose (-v) Aufruf, was er alles genau an Parametern übergibt. Evtl gibt der Mexaufruf schon ein passendes Flag mit, so dass man nicht mit Hilfe von "-D" etwas selbst generieren muss. Aber ansonsten macht man es, wie Jan beschrieben hat
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 20.08.2012, 16:54     Titel: Re: MEX-Dateien (C) - wie MEX-Kompilierung erkennen?
  Antworten mit Zitat      
Hallo flashpixx,
Code:
Matlab nutzt meines Wissens den installierten C/C++ Compiler für Mex,...

Ich habe zum Testen der Performance und zur Unterstützung unterschiedlicher Platformen die Compiler aus den Windows SDKs 6.0, 6.0A, 7.0 und 7.1 jeweils für 32 und 64 Bit installiert. Dazu noch MSVC 2008 Express und 2010 Express. Ausserdem noch LCC, der mit den 32 Bit Versionen von Matlab mitgeliefert wird. Und für die alten Matlab Versionen, die nicht mehr unter win7 laufen noch Borlands BCC 5.5, OpenWatcom OWC1.8 und den moderneren LCC3.8, den man im Internet downloaden kann.
Matlab nutzt dann immer den Compiler, der in <PREFDIR>/mexopts.bat angegeben ist. Um dieses File nicht dauernd ersetzen zu müssen, habe ich einen Satz dieser BAT Files und wähle das gewünschte mit einem Argument für den MEX-Befehl aus. Dabei übergebe ich nicht nur -DMATLAB sondern auch noch die Versionsnummer, z.B. -DMATLAB=0708.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
flashpixx
Forum-Guru

Forum-Guru


Beiträge: 355
Anmeldedatum: 19.04.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.08.2012, 17:13     Titel: Re: MEX-Dateien (C) - wie MEX-Kompilierung erkennen?
  Antworten mit Zitat      
Hi Jan,

Jan S hat Folgendes geschrieben:

Matlab nutzt dann immer den Compiler, der in <PREFDIR>/mexopts.bat angegeben ist. Um dieses File nicht dauernd ersetzen zu müssen, habe ich einen Satz dieser BAT Files und wähle das gewünschte mit einem Argument für den MEX-Befehl aus. Dabei übergebe ich nicht nur -DMATLAB sondern auch noch die Versionsnummer, z.B. -DMATLAB=0708.


Das -D ist etwas schlecht, denke ich, denn bei Gcc/G++ wird über -D das Compilerflag gesetzt also z.B. -DNDEBUG, was ja bei MSVC via /DNDEBUG gesetzt wird. Ich kann ja im Quellcode via Präprozessor Macros prüfen, welcher Compiler gerade den Code compiliert. Ich meine wenn ich im C/C++ unterschiedlich auf einen Compiler reagieren muss, dann würde ich direkt nach dem Compiler fragen also #ifdef __GNUC__ wenn man natürlich nun noch unterschiedlich auf diverse Matlabversionen reagieren muss, wäre die Frage ob Matlab nicht von sich aus, so ein Flag mitgibt bzw. ob man dann nicht automatisch in der mexopts.bat dedektieren kann, welche Matlabversion verwendet wird.

Rein technisch müsste man eigentlich auch die Mex DLL außerhalb von Matlab compilieren können, denn letztendlich schiebt ja Matlab nur einen Satz an Parameter an den Compiler bzw. Linker, d.h. z.B. mit einem externen Buildsystem wie z.B. Scons müsste man das noch etwas flexibler hin bekommen. Also z.B. direkt automatisch ermitteln lassen, welche Matlabversion im System installiert ist.
Das Problem mit den Batchdateien ist halt, dass man damit nicht wirklich cross-plattform ist, wenn man z.B. ein Mex File unter verschiedenen OS bauen will

Ist halt nur so ein Gedanke. Ich würde halt möglichst viel automatisch machen lassen, weil ich mich ja kenne, dass ich gerne mal Parameter falsch übergebe und mich dann wundere, wenn das irgendwie nicht geht.
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 21.08.2012, 18:16     Titel: Re: MEX-Dateien (C) - wie MEX-Kompilierung erkennen?
  Antworten mit Zitat      
Hallo flashpixx,

Das "-D" ist genau richtig als Parameter für den mex() Befehl, siehe http://www.mathworks.de/help/techdoc/ref/mex.html.

Zitat:
Ich meine wenn ich im C/C++ unterschiedlich auf einen Compiler reagieren muss, dann würde ich direkt nach dem Compiler fragen also #ifdef __GNUC__

Exakt.

Zitat:
... wenn man natürlich nun noch unterschiedlich auf diverse Matlabversionen reagieren muss, wäre die Frage ob Matlab nicht von sich aus, so ein Flag mitgibt

Macht es nicht. Es werden zwar Aufrufe für die jeweilige Interface-Version definiert, z.B. wird mxGetData auf mxGetData_703 "umgebogen". Aber dies geschieht nicht dokumentiert und ist deshalb nicht zuverlässig.

Zitat:
... bzw. ob man dann nicht automatisch in der mexopts.bat dedektieren kann, welche Matlabversion verwendet wird.

In modernen mexopts.bat kann man dies von Matlab aus - aber nicht innerhalb des Compilers während der Arbeit. Zudem kann ein mexopts.bat File ja auch von verschiedenen Matlab-Versionen aus benutzt werden.

Zitat:
Rein technisch müsste man eigentlich auch die Mex DLL außerhalb von Matlab compilieren können, ...

Ja, das funktioniert und dies wird in der Dokumentation auch beschrieben.

Zitat:
Also z.B. direkt automatisch ermitteln lassen, welche Matlabversion im System installiert ist.

Auf meinem System sind 9 Matlab Versionen installiert, so dass eine automatische Ermittlung sicherlich scheitern wird.

Zitat:
Das Problem mit den Batchdateien ist halt, dass man damit nicht wirklich cross-plattform ist, wenn man z.B. ein Mex File unter verschiedenen OS bauen will

Lustigerweise ist das mexopts.bat-File keine Batch-Datei. Die Syntax stimmt zwar (siehe Kommentar-Zeilen), aber sie wird nicht vom Windows-Interpreter benutzt. Stattdessen wird die Datei von einem PERL-Skript geparst und die Strings benutzt, um den CommandLine-Aufruf für den Compiler zu erstellen. Dies funktioniert deshalb unter windows, Linux und MacOS equivalent. Danach erst wird der erstellte Befehl wieder an eine M-Funktion zurückgeliefert und von dort aus per SYSTEM() ausgeführt. Dies ist dermaßen verwurstelt, dass eine manuelle Änderung am mexopt.bat File zu sagen wir mal verblüffenden Resultaten führen kann. Auch die Parameter für den MEX() Befehl werden deshalb etwas schrullig: Wenn ich GCC mitteilen möchte, dass es statt C89 doch bitte das "moderne" C99 verwenden soll, benötigt man:
Code:
mex('-O', 'CFLAGS="\$CFLAGS', '-std=c99"', 'myFunc.c');
% Intuitiver wäre:
mex('-O', 'CFLAGS="\$CFLAGS -std=c99"', 'myFunc.c');  % ERROR!

Das Erweitern von CFLAG benötigt also eine Aufteilung in zwei Strings, damit nach dem Parsen in PERL wieder ein String daraus wird, der in Double-Quotes eingeschlossen ist.
Ohne Frage ist MEX durch die Zwischenschritte über PERL zwar weitgehend plattform-übergreifend, aber ein normales M-File mit einem "if ispc", "if ismac" und "if isunix" hätte es einfacher und direkter auch lösen können.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Nicolas S.
Themenstarter

Forum-Century

Forum-Century


Beiträge: 146
Anmeldedatum: 15.07.09
Wohnort: ---
Version: R2014a/b
     Beitrag Verfasst am: 22.08.2012, 19:02     Titel: Re: MEX-Dateien (C) - wie MEX-Kompilierung erkennen?
  Antworten mit Zitat      
Jan S hat Folgendes geschrieben:

Lustigerweise ist das mexopts.bat-File keine Batch-Datei. Die Syntax stimmt zwar (siehe Kommentar-Zeilen), aber sie wird nicht vom Windows-Interpreter benutzt. Stattdessen wird die Datei von einem PERL-Skript geparst und die Strings benutzt, um den CommandLine-Aufruf für den Compiler zu erstellen.


Das erklärt natürlich so einiges. Hatte mal testweise in der BAT herumgefuhrwerkt, um den GCC ans Laufen zu bekommen und es am Ende aufgegeben (und nutze jetzt make).
_________________

--
The programmer suggested it.
Private Nachricht senden Benutzer-Profile anzeigen
 
flashpixx
Forum-Guru

Forum-Guru


Beiträge: 355
Anmeldedatum: 19.04.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.08.2012, 20:04     Titel:
  Antworten mit Zitat      
Hi Jan,

das mit dem Perl finde ich ja wirklich richtig gruselig. Ich überlege gerade mal, da ich als cross-plattfrom Buildsystem Scons ( http://www.scons.org/ ) verwende, ob ich ggf mal eine Basisscript baue, was man zum compilieren kann. Ich würde das dann auch hier posten, gerade wenn Du mit 9 verschiedenen Versionen arbeitest, dann wäre es evtl durchaus sinnvoll, wenn man außerhalb compiliert und dann dem Buildscript einfach den Pfad zur Matlabinstallation mitgibt.

Ist das Mex-Interface eigentlich über die letzten Versionen identisch?
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 - 2025 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.