Как подружить 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 – класс обмена данными между библиотекой и приложением. Он достаточно подробно описан в хелпе по матлабовскому компилятору.
На сим, пожалуй, всё! Компилируйте и радуйтесь!
