Як подружити matlab і visual c - імаркетінг все про створення і просування сайтів (і трохи про

По роботі вилізла проблема. Необхідно поєднати потужність Matlab і інтерфейси Visual C ++. При цьому необхідно, щоб отриманий софт працював на комп'ютерах, де МАТЛАБ не встановлено. (Відразу зазначу, що до білдінга релізной версії поки ще зарано 🙂).

Поганявши по сайту розробників Матлаб дізнаємося, що ці системи можна подружити трьома способами:

  1. Створити в Матлаб незалежне додаток і підключити його в С ++;
  2. Використовувати Matlab Engine (хотів спробувати цей спосіб, однак, не прокатав. Пізніше знайшов на сайті розробників, що ця можливість в Матлаб нових версій видалена. З незрозумілих особисто мені причин);
  3. Створити динамічну бібліотеку (dll) і потім використовувати її в С ++;

Ми підемо третім шляхом, так як він найбільш логічний.

Трохи дізнаємося про МАТЛАБ. Я-то з ним раніше в універі працював, тому швидко все згадав. А для новачків приведу найголовніше:

У Матлаб можна писати так звані скрипти і функції. Вони між собою принципово різняться. Функції можуть викликатися з інших функцій, а скрипти - немає. Саме тому при компіляції dll необхідно використовувати функції, а не скрипти!

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

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-ник).

Там бачимо рядки:

#include "mclmcrrt.h"
#include "mclcppclass.h"

Ці файли лежать впапке з Матлаб: ... \ MATLAB \ extern \ include \

Копіюємо їх в наш проект і додаємо: Project-> Add To Project -> Files

Після цього пробуємо скомпілювати. Нічого подібного! Потрібні ще файли. Дивимося на їх назви в помилках і послідовно копіюємо і додаємо в проект. Там їх не дуже багато))

Після всього цього тиснемо на Alt + F7 і починаємо найскладніше: настройку проекту. Від цього етапу залежить успіх всього заходу.

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

І последнійетап настройки. Йдемо в вкладку Resorse, де в поле Additional Resourse пишемо матлабовскую папку: ... \ MATLAB \ extern \ include \.

Усе. проект налаштований

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

sinWPInitialize (); // Ініціалізація бібліотеки
int z = 1; // ініціалізувавши змінну
mwArray zz (0); // Створюємо об'єкт mwArray
sinus (z, zz); // Обчислюємо синус. (Zz - в.

Клас mwArray - клас обміну даними між бібліотекою і додатком. Він досить докладно описаний в хелпе по матлабовскому компілятору.

На сім, мабуть, все! Компілюйте і радійте!

Приклад хороший, спасибі!

Все зробив.
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 файл. Куди його вставляти, і де прописується до нього шлях?

для 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, що додаток консольне? Все перепробував - не виходить.
Може хто допоможе?