Сен
11

Как подружить Matlab и Visual C++

Как подружить Matlab и Visual C++

По работе вылезла проблема. Необходимо совместить мощность и интерфейсы . При этом необходимо, чтобы полученный софт работал на компьютерах, где матлаб не установлен. (Оговорюсь сразу, что до билдинга релизной версии пока ещё рановато :) ).

 

Итак мы имеем:

 

  1. Matlab 2008a (7.6.0.324) - данная версия очень удобна в том, что можно создавать приложения с графической оболочкой.
  2. 6.0 + Visual Assist – уже классика. Обновлять не хочу

Порыскав по сайту разработчиков матлаба узнаем, что эти системы можно подружить тремя способами:

 

  1. Создать в матлабе независимое приложение и подключить его в С++;
  2. Использовать Matlab Engine (хотел попробовать этот способ, однако, не прокатил. Позже нашёл на сайте разработчиков, что эта возможность в матлабе новых версий удалена. По непонятным лично мне причинам);
  3. Создать динамическую библиотеку () и затем использовать её в С++;

Мы пойдём третим путём, так как он наиболее логичный.

 

Немного узнаем про матлаб. Я-то с ним раньше в универе работал, поэтому быстро всё вспомнил. А для новичков приведу самое основное:

В матлабе можно писать так называемые и функции. Они между собой принципиально различаются. Функции могут вызываться из других функций, а – нет. Именно поэтому при компиляции dll необходимо использовать функции, а не !

Создадим простейшую функцию: m- , вычисляющую синус фиксированного значения.

1
2
function s=sinus()
s=sin(2);

Нажимаем F5 и радуемся значению ans =0.9093 в Command Window. Работает!!

Для начала необходимо настроить . Описаний по настройке хватает, поэтому не будем уделять этому внимание. Лучше пойдем дальше разбираться.

 В командном окне набираем команду Deploytool и давим Enter. Получаем примерно такое:

 Как подружить Matlab и Visual C++

 Давим на иконку нового проекта, выбираем C++ Shared library

 Как подружить Matlab и Visual C++

 Внизу вводим имя (рекомендую это сделать, иначе вы рискуете запутаться) и давим ОК

 Как подружить Matlab и Visual C++

 Видим перед собой три папки. Сейчас нас интресует Exported Functions. Туда добавляем наш m-файлик с синусом и давим на build (Как подружить Matlab и Visual C++).

 Ждём пока соберется . Она собирается не очень быстро. Самое время отдохнуть.

 Вот собралась наша библиотека. Идём в папку проекта и видим две папочки: /distrib и /src. Легко догадаться, что нас интересует первая из них.

 В папке видим пять файлов. readme.txt нас не интересует вообще. Полезной инфы там обычно не пишут )))

 *.dll, *.lib, *.h – это те файлы, с которыми будем работать.

 

Самое время заняться проектом под Visual C++.

 Обычно в книжках пишут создание проектов под консоль. Мы же сразу пойдём с ножом на танк и создадим MFC application. Сделаем его диалоговым (вот просто так мне захотелось).

 Самая сложность возникает при настройке проекта. Так как код обработки – примитивный до нельзя.

 Сначала подключаем все необходимые файлы (полученный из библиотеки h-ник).

 Там видим строки:

1
2
#include "mclmcrrt.h"
#include "mclcppclass.h"

 Эти файлы лежат впапке с матлабом: …\MATLAB\extern\include\

 Копируем их в наш и добавляем: Project->Add To Project -> Files

 После этого пробуем скомпилировать. Ничего подобного! Нужны ещё файлы. Смотрим на их названия в ошибках и последовательно копируем и добавляем в проект. Там их не очень много ))

 После всего этого давим на Alt+F7 и начинаем самое сложное: настройку проекта. От этого этапа зависит успех всего мероприятия.

 Как подружить Matlab и Visual C++

 Вкладка Link->general. В поле Object/Library Modules рисуем нашу библиотеку (*.lib) и библиотеку mclmcrrt.lib (именно в ней реализован класс mwArray, через который синхронизируется обмен данными с нашей библиотекой). Если вы не подключите mclmcrrt.lib то при инициализации mwArray получите красивую ошибку LNK2001.

 Вкладка Link->. В поле Additional Library Path пишем директорию из матлаба: …\MATLAB\extern\lib\win32\microsoft\. Это говорит компилятору о дополнительном пути поиска необходимых библиотек.

  Как подружить Matlab и Visual C++

  И последнийэтап настройки. Идём в вкладку Resorse, где в поле Additional Resourse пишем матлабовскую папку: …\MATLAB\extern\include\.

 

pr_res.gif

 

Всё. Проект настроен

 Теперь в визуальном редакторе на нашем диалоговом окне создадим кнопочку вычисления синуса, по нажатию на которую будет этот самый синус и вычисляться силами нашей библиотечки.

 Обработка будет выглядеть примерно так (в очень упрощенном виде, убраны все проверки на наличие библиотек, на валидность значений и т.д.):

1
2
3
4
5
sinWPInitialize(); //Инициализация библиотеки
int z=1; //Инициализируем переменную
mwArray zz(0); //Создаем объект mwArray
sinus(z,zz); //Вычисляем синус. (zz - выходной параметр)
sinWPTerminate(); //Очистка памяти после работы библиотеки

Класс mwArray – класс обмена данными между библиотекой и приложением. Он достаточно подробно описан в хелпе по матлабовскому компилятору.

На сим, пожалуй, всё! Компилируйте и радуйтесь!

Козлов Эдуард, ОИПИ Академии Наук Республики Беларусь

19 коммент. к записи “Как подружить Matlab и Visual C++”

  • Dmitry 27 октября 2010 - 17:10

    Пример хороший, спасибо!

  • ALEX222 24 января 2011 - 11:13

    Все сделал.
    VC++ 6.0 пишет ошибки
    c:\program files\microsoft visual studio\myprojects\matlab\matlab\mclmcrrt.h(140) : error C2061: syntax error : identifier ‘REFCLSID’
    c:\program files\microsoft visual studio\myprojects\matlab\matlab\mclmcrrt.h(161) : error C2065: ‘REFCLSID’ : undeclared identifier
    c:\program files\microsoft visual studio\myprojects\matlab\matlab\mclmcrrt.h(161) : error C2146: syntax error : missing ‘)’ before identifier ‘clsid’
    c:\program files\microsoft visual studio\myprojects\matlab\matlab\mclmcrrt.h(163) : error C2059: syntax error : ‘)’
    c:\program files\microsoft visual studio\myprojects\matlab\matlab\mclmcrrt.h(171) : error C2061: syntax error : identifier ‘REFCLSID’
    c:\program files\microsoft visual studio\myprojects\matlab\matlab\mclmcrrt.h(184) : error C2065: ‘REFGUID’ : undeclared identifier
    c:\program files\microsoft visual studio\myprojects\matlab\matlab\mclmcrrt.h(184) : error C2146: syntax error : missing ‘)’ before identifier ‘guid’
    c:\program files\microsoft visual studio\myprojects\matlab\matlab\mclmcrrt.h(184) : error C2182: ‘mclGUIDtochar_proxy’ : illegal use of type ‘void’
    c:\program files\microsoft visual studio\myprojects\matlab\matlab\mclmcrrt.h(184) : error C2059: syntax error : ‘)’
    c:\program files\microsoft visual studio\myprojects\matlab\matlab\mclmcrrt.h(191) : error C2146: syntax error : missing ‘)’ before identifier ‘clsid’
    c:\program files\microsoft visual studio\myprojects\matlab\matlab\mclmcrrt.h(193) : error C2059: syntax error : ‘)’
    c:\program files\microsoft visual studio\myprojects\matlab\matlab\mclmcrrt.h(200) : error C2146: syntax error : missing ‘)’ before identifier ‘clsid’
    c:\program files\microsoft visual studio\myprojects\matlab\matlab\mclmcrrt.h(200) : error C2182: ‘mclCLSIDtochar_proxy’ : illegal use of type ‘void’
    c:\program files\microsoft visual studio\myprojects\matlab\matlab\mclmcrrt.h(200) : error C2059: syntax error : ‘)’
    c:\program files\microsoft visual studio\myprojects\matlab\matlab\mclmcrrt.h(214) : error C2146: syntax error : missing ‘)’ before identifier ‘clsid’
    c:\program files\microsoft visual studio\myprojects\matlab\matlab\mclmcrrt.h(216) : error C2059: syntax error : ‘)’
    c:\program files\microsoft visual studio\myprojects\matlab\matlab\mclmcrrt.h(224) : error C2061: syntax error : identifier ‘REFCLSID’

  • K_E_V_in 24 января 2011 - 11:34

    У вас все ошибки синтаксические. Проверяйте внимательнее

  • ALEX222 24 января 2011 - 13:05

    Т.е. самому исправлять заголовочный файл mclmcrrt.h?
    Почему там возникли ошибки?

  • K_E_V_in 24 января 2011 - 13:08

    Скорее всего, вы скопировали не все необходимые файлы.

  • ALEX222 24 января 2011 - 15:29

    Закоментил строки
    //#include “mclmcrrt.h”
    //#include “mclcppclass.h”
    Пишет ошибку
    Compiling…
    matlab.cpp
    Linking…
    new_sposob.dll : fatal error LNK1136: invalid or corrupt file
    Error executing link.exe.

    А как вообще учавствует dll файл. Куда его вставлять, и где прописывается к нему путь?

  • K_E_V_in 24 января 2011 - 16:22

    Путь к lib прописывается в свойствах к проекту, а dll нужно положить туда же. 99%, что ошибка в настройках проекта. Попытаюсь найти у себя этот проект, с которого писалась статья и выложить его.

  • Andre 10 февраля 2011 - 16:07

    После:
    sinWPInitialize(); //Инициализация библиотеки

    лучше еще проверить корректность инициализации MCR:
    bool mclIsMCRInitialized();

  • Andre 10 февраля 2011 - 16:21

    Пути к lib пробивать не нужно. Просто скопируйте mclmcrrt.lib (для своего компилятора) в свою папку и подключите к проекту, как и lib-созданную Matlab’ ом

  • Andre 11 февраля 2011 - 0:06

    для K_E_V_in

    Matlab Engine никуда не делся. По крайней мере в R2009а – R2010b такая возможность есть. Но этот вариант не очень подходит под обозначенную Вами задачу – создание независимого от Matlab приложения.

  • Flexx02 21 апреля 2011 - 1:30

    Доброе время суток. Проблема назрела такого типа:
    добавляю я все те h-файлы и всё нормально, потом добавляю matrix.h и после него просит файл, я его естествено точно так же как и 3 перед этим добавляю и дебажу а его не видит, пробую через ADD->Existing Item… и всё равно без изменений.
    Посоветуйте пожалуйста в чом может быть проблема и как её исправить.
    Заранее спасибо.

  • Flexx02 22 апреля 2011 - 12:38

    Всё разобралса=)
    Прикол был в том что в матлабовском matrix.h подключалса хедер tmwtypes.h
    но он подключалса таким образом
    #include
    иза етого его не находило, нада просто в добавленом матриксе поменять тип подключения с
    #include
    на
    #include”tmwtypes.h”
    там есть какаято разница в типе поиске, оно иго ищет дето в другом месте

    P. S. кодил всё ето в Visual C++ 2008 Version 9.0.21022.8 – может комуто поможет

  • K_E_V_in 26 апреля 2011 - 23:45

    Вот и отлично!

  • Flexx02 27 апреля 2011 - 20:18

    Ищо один вопросик, возможно ли подключить DLL из Того же матлаба к Билдер С++???
    И работал ли кто то с такой системой???

  • K_E_V_in 29 апреля 2011 - 7:48

    Теоретически – можно. Практически, лично я не работал

  • Andre 29 апреля 2011 - 9:49

    Для Flexx02
    Я подключал. Компилятор Matlab новых версий не поддерживает Борландовых компиляторов. Поступал следующим образом:
    1) Создавал DLL в Visual C++ (подходит бесплатная Express версия), которая статически линковала созданную Matlab’ом dll (аналогично тому как описанно здесь). Функции новой DLL выполняли функции перевода данных стандартных типов C в mwArray и запуск соответствующих функций из dll, созданной Matlab.
    2)В проекте Builder С++ динамически загружал библиотеку, созданную в VC

  • Flexx02 12 мая 2011 - 11:27

    Все проблемы решены, намного легче использовать .NET для подключений DLL с Matlab, и с ними намного легче работать.
    Если у кого то будет стоять подобная задача, советую использовать .NET

  • ssn73 22 августа 2011 - 16:52

    Помогите пожалуйста, есть пара вопросов:
    - нужна ли среда mcr на машине, если я сгенерирую dll и потом буду использовать в си приложении на linux
    - я сделал исполняемый файл и запускаю его на linux – все работает на машине, где установлена графическая библиотека. Но есть необходимость в запуске на системе, где нет графики, но mcr ее запрашивает при запуске. Как сказать mcr, что приложение консольное? Все перепробовал – не получается.
    Может кто поможет?

  • K_E_V_in 22 августа 2011 - 23:54

    mcr нужна, насчет линукса – не знаю

Прокомментировать

Рубрики

Облако меток

На волнах твиттера

В прямом эфире