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

По работе вылезла проблема. Необходимо совместить мощность Matlab и интерфейсы Visual C++. При этом необходимо, чтобы полученный софт работал на компьютерах, где матлаб не установлен. (Оговорюсь сразу, что до билдинга релизной версии пока ещё рановато
).
Итак мы имеем:
- Matlab 2008a (7.6.0.324) - данная версия очень удобна в том, что можно создавать приложения с графической оболочкой.
- Visual C++ 6.0 + Visual Assist – уже классика. Обновлять не хочу
Порыскав по сайту разработчиков матлаба узнаем, что эти системы можно подружить тремя способами:
- Создать в матлабе независимое приложение и подключить его в С++;
- Использовать Matlab Engine (хотел попробовать этот способ, однако, не прокатил. Позже нашёл на сайте разработчиков, что эта возможность в матлабе новых версий удалена. По непонятным лично мне причинам);
- Создать динамическую библиотеку (dll) и затем использовать её в С++;
Мы пойдём третим путём, так как он наиболее логичный.
Немного узнаем про матлаб. Я-то с ним раньше в универе работал, поэтому быстро всё вспомнил. А для новичков приведу самое основное:
В матлабе можно писать так называемые скрипты и функции. Они между собой принципиально различаются. Функции могут вызываться из других функций, а скрипты – нет. Именно поэтому при компиляции dll необходимо использовать функции, а не скрипты!
Создадим простейшую функцию: m-файл , вычисляющую синус фиксированного значения.
1 2 | function s=sinus() s=sin(2); |
Нажимаем F5 и радуемся значению ans =0.9093 в Command Window. Работает!!
Для начала необходимо настроить Matlab Compiler. Описаний по настройке хватает, поэтому не будем уделять этому внимание. Лучше пойдем дальше разбираться.
В командном окне набираем команду Deploytool и давим Enter. Получаем примерно такое:

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

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

Видим перед собой три папки. Сейчас нас интресует Exported Functions. Туда добавляем наш m-файлик с синусом и давим на build (
).
Ждём пока соберется библиотека. Она собирается не очень быстро. Самое время отдохнуть.
Вот собралась наша библиотека. Идём в папку проекта и видим две папочки: /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 и начинаем самое сложное: настройку проекта. От этого этапа зависит успех всего мероприятия.

Вкладка Link->general. В поле Object/Library Modules рисуем нашу библиотеку (*.lib) и библиотеку mclmcrrt.lib (именно в ней реализован класс mwArray, через который синхронизируется обмен данными с нашей библиотекой). Если вы не подключите mclmcrrt.lib то при инициализации mwArray получите красивую ошибку LNK2001.
Вкладка Link->Input. В поле Additional Library Path пишем директорию из матлаба: …\MATLAB\extern\lib\win32\microsoft\. Это говорит компилятору о дополнительном пути поиска необходимых библиотек.

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

Всё. Проект настроен
Теперь в визуальном редакторе на нашем диалоговом окне создадим кнопочку вычисления синуса, по нажатию на которую будет этот самый синус и вычисляться силами нашей библиотечки.
Обработка будет выглядеть примерно так (в очень упрощенном виде, убраны все проверки на наличие библиотек, на валидность значений и т.д.):
1 2 3 4 5 | sinWPInitialize(); //Инициализация библиотеки int z=1; //Инициализируем переменную mwArray zz(0); //Создаем объект mwArray sinus(z,zz); //Вычисляем синус. (zz - выходной параметр) sinWPTerminate(); //Очистка памяти после работы библиотеки |
Класс mwArray – класс обмена данными между библиотекой и приложением. Он достаточно подробно описан в хелпе по матлабовскому компилятору.
На сим, пожалуй, всё! Компилируйте и радуйтесь!
19 коммент. к записи “Как подружить Matlab и Visual C++”
Прокомментировать
Рубрики
- javascript
- SEO
- Smarty
- UIPI
- Боремся со СПАМом
- Верстка
- Движки форумов
- Железо
- Забавно
- Интернет в лицах
- Интернет-магазины
- Новости
- Обзоры сайтов
- Обо всем
- Полезные скрипты
- Работа с CMS
- Создание сайтов
- Уроки рекламы
- Шаблоны

Пример хороший, спасибо!
Все сделал.
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’
У вас все ошибки синтаксические. Проверяйте внимательнее
Т.е. самому исправлять заголовочный файл mclmcrrt.h?
Почему там возникли ошибки?
Скорее всего, вы скопировали не все необходимые файлы.
Закоментил строки
//#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 файл. Куда его вставлять, и где прописывается к нему путь?
Путь к lib прописывается в свойствах к проекту, а dll нужно положить туда же. 99%, что ошибка в настройках проекта. Попытаюсь найти у себя этот проект, с которого писалась статья и выложить его.
После:
sinWPInitialize(); //Инициализация библиотеки
лучше еще проверить корректность инициализации MCR:
bool mclIsMCRInitialized();
Пути к lib пробивать не нужно. Просто скопируйте mclmcrrt.lib (для своего компилятора) в свою папку и подключите к проекту, как и lib-созданную Matlab’ ом
для K_E_V_in
Matlab Engine никуда не делся. По крайней мере в R2009а – R2010b такая возможность есть. Но этот вариант не очень подходит под обозначенную Вами задачу – создание независимого от Matlab приложения.
Доброе время суток. Проблема назрела такого типа:
добавляю я все те h-файлы и всё нормально, потом добавляю matrix.h и после него просит файл, я его естествено точно так же как и 3 перед этим добавляю и дебажу а его не видит, пробую через ADD->Existing Item… и всё равно без изменений.
Посоветуйте пожалуйста в чом может быть проблема и как её исправить.
Заранее спасибо.
Всё разобралса=)
Прикол был в том что в матлабовском matrix.h подключалса хедер tmwtypes.h
но он подключалса таким образом
#include
иза етого его не находило, нада просто в добавленом матриксе поменять тип подключения с
#include
на
#include”tmwtypes.h”
там есть какаято разница в типе поиске, оно иго ищет дето в другом месте
P. S. кодил всё ето в Visual C++ 2008 Version 9.0.21022.8 – может комуто поможет
Вот и отлично!
Ищо один вопросик, возможно ли подключить DLL из Того же матлаба к Билдер С++???
И работал ли кто то с такой системой???
Теоретически – можно. Практически, лично я не работал
Для Flexx02
Я подключал. Компилятор Matlab новых версий не поддерживает Борландовых компиляторов. Поступал следующим образом:
1) Создавал DLL в Visual C++ (подходит бесплатная Express версия), которая статически линковала созданную Matlab’ом dll (аналогично тому как описанно здесь). Функции новой DLL выполняли функции перевода данных стандартных типов C в mwArray и запуск соответствующих функций из dll, созданной Matlab.
2)В проекте Builder С++ динамически загружал библиотеку, созданную в VC
Все проблемы решены, намного легче использовать .NET для подключений DLL с Matlab, и с ними намного легче работать.
Если у кого то будет стоять подобная задача, советую использовать .NET
Помогите пожалуйста, есть пара вопросов:
- нужна ли среда mcr на машине, если я сгенерирую dll и потом буду использовать в си приложении на linux
- я сделал исполняемый файл и запускаю его на linux – все работает на машине, где установлена графическая библиотека. Но есть необходимость в запуске на системе, где нет графики, но mcr ее запрашивает при запуске. Как сказать mcr, что приложение консольное? Все перепробовал – не получается.
Может кто поможет?
mcr нужна, насчет линукса – не знаю