По роботі вилізла проблема. Необхідно поєднати потужність Matlab і інтерфейси Visual C ++. При цьому необхідно, щоб отриманий софт працював на комп'ютерах, де МАТЛАБ не встановлено. (Відразу зазначу, що до білдінга релізной версії поки ще зарано 🙂).
Поганявши по сайту розробників Матлаб дізнаємося, що ці системи можна подружити трьома способами:
- Створити в Матлаб незалежне додаток і підключити його в С ++;
- Використовувати Matlab Engine (хотів спробувати цей спосіб, однак, не прокатав. Пізніше знайшов на сайті розробників, що ця можливість в Матлаб нових версій видалена. З незрозумілих особисто мені причин);
- Створити динамічну бібліотеку (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, що додаток консольне? Все перепробував - не виходить.
Може хто допоможе?