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

M-File zu Shared Library compilieren und in Matlab laden

 

K90

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.02.2013, 14:46     Titel: M-File zu Shared Library compilieren und in Matlab laden
  Antworten mit Zitat      
Hallo,

ich möchte gern ein M-File mit einer Matlab-Funktion zu einer Shared Library compilieren um diese dann wieder in Matlab nuten zu können.

Das M-File AExampleLibFunction.m enthält die folgende Funktion:
Code:

function AExampleLibFunction
   msgbox('Hello World', '');
end
 


Im folgenden nutze ich das deploytool. Als "Type:" wähle ich "C Shared Library" und füge zu dem Projekt anschließend das M-File AExampleLibFunction.m hinzu. Nach dem beenden des Build-Prozesses erhalte ich die Dateien:
AExampleLib.dll
AExampleLib.lib
AExampleLib.h
readme.txt

Versuche ich dann die AExampleLib.dll mit
Code:
>> loadlibrary('AExampleLib.dll', 'AExampleLib.h')
zu laden erhalte ich ein paar Warnungen, die ich gerne vermeiden möchte.
Code:
Warning: The data type 'FcnPtr' used by function AExampleLibInitializeWithHandlers  does
not exist.


Nach einem Aufruf von
Code:

>> libfunctions('AExampleLib')
Functions in library AExampleLib:

AExampleLibGetMcrID                   AExampleLibTerminate              
AExampleLibInitialize                     mlfAExampleLib                    
AExampleLibInitializeWithHandlers  mlxAExampleLib                    
AExampleLibPrintStackTrace

erhalte ich zwar einen Überblick zu den in der DLL enthaltenen Funktionen, aber ich habe keine Ahnung wie ich diese nutze.


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 03.02.2013, 16:11     Titel:
  Antworten mit Zitat      
Hallo,

die erste Frage wäre aus meiner Sicht: warum das ganze?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
K90

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.02.2013, 22:55     Titel: Warum das Ganze?
  Antworten mit Zitat      
Hallo Harald,

Da bei uns an der Uni von ehemals ca. 300 Lizenzen für die Forschung in diesem Jahr nur 75 Lizenzen verfügbar sind. So kann es schon mal passieren, das du nach der Mittagspause mit deiner Arbeit nicht fortfahren kannst, weil der Lizenzserver dir keine Lizenz mehr bereitstellen kann. Daher möchte ich ein von mir häufig genutztes Matlab Programm als Standalone Anwendung kompilieren. Da dieses Programm modular gestaltet ist möchte ich gerne die einzelnen Module als Shared Library kompilieren.

Es sollte doch möglich sein.
1.) Es ist möglich eine M-File zu einer DLL zu kompilieren.
2.) Es ist möglich DLLs zu laden.

Gruß K90

P.S. Kompilierter Code ist schneller als interpretierter Code, also von daher macht es doch auch sinn manchmal eine M-file zu kompilieren.
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 03.02.2013, 23:49     Titel:
  Antworten mit Zitat      
Hallo,

es geht also um Toolbox-Lizenzen? Für die von dir geplante Vorgehensweise wirst du ja weiter eine MATLAB-Lizenz brauchen.

Das Einbinden der Bibliothek sollte auch unter MATLAB möglich sein.
Ich würde es zunächst mal bei libfunctions mit der Option -full versuchen, um auch die Ein- und Ausgabeargumente zu sehen.

Schau dir auch mal das hier an:
http://www.mathworks.com/help/relea.....hared-library-target.html
Das ist ein Beispiel, wie typischer C-Code aussehen sollte, um die DLL einzubinden. Diesen Code musst du dann wiederum in MATLAB und in CALLLIB-Aufrufe abbilden. Ich würde also versuchen, mich an dieses Beispiel statt das "Hello World"-Beispiel zu halten, da hier schon mehr vorgegeben ist und du in deinen Modulen wohl ohnehin Ein- und Ausgabeargumente haben wirst.

Zitat:
also von daher macht es doch auch sinn manchmal eine M-file zu kompilieren.

Nein, da der Code nicht in diesem Sinne kompiliert wird. Er läuft dann zwar unabhängig von MATLAB, aber immer noch in einer Runtime Umgebung (MATLAB Compiler Runtime). Ein Geschwindigkeitsvorteil ist damit jedenfalls nicht verbunden. Dazu müsstest du über MATLAB Coder gehen.

Grüße,
Harald

P.S.: Ich finde es auch bedauerlich, wenn eine Universität an den Arbeitsmitteln für ihre Forscher kürzt.
Private Nachricht senden Benutzer-Profile anzeigen
 
Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 05.02.2013, 10:49     Titel:
  Antworten mit Zitat      
Was ist den das für eine Uni?? Ich hoffe eine Kleinere. Normalerweise reden wir hier von 10^2 grösseren MATLAB Nutzergruppen Shocked

http://www.gomatlab.de/matlab-fuer-.....ftler-der-tum-t21562.html

Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
K90

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.02.2013, 13:09     Titel: Mit C klappts, aber das will ich ja nicht wirklich
  Antworten mit Zitat      
Hallo Harald,

ich habe mich mit dem Teil der Doku, auf die du verlinkt hattest beschäftigt. In einem kleinem C-Beispielprogramm klappt das auch soweit.

Im folgenden dazu eine kleine Anleitung. Im Anschluss erläutere ich mein Problem.

1. HelloWorld.m
Code:

function HelloWorld
    fid= 1; % STDIO
    fprintf(fid, '%s\n', 'Hello World');
end
 


2. HelloWorld.m mit mcc kompilieren
Code:

mcc -B csharedlib:LibHelloWorld HelloWorld.m -v
 


3. HelloWorldDriver.c
Code:


#include <stdio.h>
#include "LibHelloWorld.h"

int main() {
    mclmcrInitialize();

    if( !mclInitializeApplication(NULL,0) ) {
        fprintf(stderr, "Could not initialize the application.\n");
       return -1;
    }
   
    if (!LibHelloWorldInitialize()){
        fprintf(stderr,"Could not initialize the library.\n");
        return -2;
    } else {
        /* Call the library function */
        mlfHelloWorld();
       
        /* Call the library termination routine */
        LibHelloWorldTerminate();
       
        mclTerminateApplication();
        /* A things are fine */
        return 0;
    }
   
    /* An error ocurred */
    return -1;
}
 


4. HelloWorldDriver.c mit mbuild kompilieren und LibHelloWorld.lib hinzulinken
Code:

mbuild HelloWorldDriver.c LibHelloWorld.li
 


5. Aus der Windowskommandozeile HelloWorldDriver.exe starten.

So mit diesen kleinen Beispiel habe ich verstanden, wie die durch Matlab erzeugten shared libraries funktionieren. Ich zweifle jetzt aber das ich den Mechnismus so Anwenden kann, wie ich das gerne möchte.

Also ich habe ein Matlabprogramm Main.m. Dieses nutzt beispielsweise 3 Module (Modul-?.m - ?:=A|B|C). Die Module möchte ich zu Modul-?.dll übersetzen, dann möchte ich meine Main.m so anpassen, das die DLL der Module mit loadlibrary() und calllibfunction() von der Main.m gesteuert werden können. Anschließend möchte ich aus der Main.m eine Main.exe machen.

Wie gesagt vllt. ist die Idee so gar nicht umsetzbar, gibt es vllt. eine alternative?

Gruß K90

P.S.
@Andreas es ist die TU-Ilmenau
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 06.02.2013, 14:01     Titel:
  Antworten mit Zitat      
Hallo,

meines Erachtens sollte das so umsetzbar sein. Bist du dabei auf konkrete Probleme gestoßen?

Wenn als Endprodukt lediglich die .EXE benötigt wird, sehe ich jedoch keine Notwendigkeit für den Weg über die DLLs.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
K90

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.02.2013, 14:27     Titel:
  Antworten mit Zitat      
Hi,

es ist eine Anwendung zum erfassen und visualisieren von Videodaten. Die Module sind dabei als Plugins zu verstehen. Sicherlich könnte ich den aktuellen Stand der Entwicklung mit allen Module zu einer exe kompilieren. Aber, so wie die Anwendung derzeit gestalltet ist, kann jede Kollege der eine spezielle Auswertung der Videodaten braucht einfach ein eigenes Modul schreiben - partielle FFTs oder was auch immer man sich da vorstellen mag. Dieses Modul wird in einen Plugin-Ordner gepackt. Die Anwendung integriert das Plugin dann automatisch. Dieses Konzept ginge mit einer komplett kompilierten Anwendung verloren. Daher dieser Versuch das Kunstück mit den DLLs zu bewerkstelligen. Ich werde wohl nicht umherkommen, neben dem Matlab-Code noch eine wenig C-Code zu erstellen, wenn es als standalone Anwendung auch so funktionieren soll.

Gruß K90
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 06.02.2013, 14:49     Titel:
  Antworten mit Zitat      
Hallo,

ich habe es zwar noch nicht versucht, das mit loadlibrary und calllib umzusetzen, aber ich sehe wie gesagt keinen Grund, warum es nicht gehen sollte.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
K90

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.02.2013, 12:07     Titel: Gelöst - Geht nicht
  Antworten mit Zitat      
Zitat:
Restrictions When using MATLAB Function loadlibrary
You can not use the MATLAB function loadlibrary inside of MATLAB to load a C shared library built with MATLAB Compiler. [1]


[1] http://www.mathworks.de/de/help/com.....ry-target.html#f2-1007377
 
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.