|
|
|||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||
| Вход | |||||||||||||||||||||||||||||||||
Раздел "MATLAB\MATLAB Compiler"
Создание DLL и их использованиеВ связи с тем, что этот вопрос многих интересует, а раздел FAQ находится пока в стадии проектирования, я попытаюсь рассказать, как создавать из m-файлов DLL, которые затем можно было бы использовать из C/C++, и, возможно Delphi. К сожалению, в наличии у меня имеется только стандартный набор разработчика LCC-WIN32 из поставки MATLAB, поэтому все действия я буду описывать с ним. Если кто-то адаптирует это для VC++ будет очень замечательно. Итак, наша цель... Буду рассказывать на примере файла additor.m:
result = x + y; Для начала, нам нужно откомпилировать m-файл в C. Это делается строкой 'mcc -x additor.m'. Тип wrapper'а (обёртки) указываем EXE потому, что нам всё равно, какую обёртку использовать (мы напишем свою). После того, как дело сделано, следующий шаг - написание обёртки. В обёртке, сгенерированной компилятором, имеются следующие строки:
{ return mclMain(argc, argv, mlxAdditor, 1, &_main_info); } Убираем их. Также в строке 'static _mex_information _main_info' убираем модификатор static для доступа к '_main_info' извне. Теперь, можно приступить к написанию переходников из C в mex. Нам понадобится создание DLL-startup процедуры для инициализации библиотек MATLAB. Для этого создаём файл main.c, следующего содержания #include Теперь, можно написать непосредственно переходник C-MEX. Это будет функция 'double additor(double x, double y)', которая осуществляет вызов MEX-процедуры. Эту функцию добавим также в main.c
{ mxArray* pX = NULL; mxArray* pY = NULL; mxArray* result = NULL; double res; mlfAssign(&pX, mlfScalar(x)); mlfAssign(&pY, mlfScalar(y)); result = mlfAdditor(pX, pY); res = *mxGetPr(result); mxDestroyArray(pX); mxDestroyArray(pY); return res; } Итак, динамическая библиотека почти готова. Осталось лишь скомпилировать её. Однако, по-умолчанию lcc использует свою LibMain процедуру для динамических библиотек, что не позволит нам автоматически вызвать процедуры инициализации. Чтобы этого избежать, исправим опции компилятора. В Win2k они хранятся в 'C:\Documents and Settings\seleznev\Application Data\MathWorks\MATLAB\R12\compopts.bat', соответственно путь зависит от системного диска и от имени пользователя. Там находим строчку 'set DLLLINKFLAGS='. Теперь, система будет использовать нашу LibMain процедуру и нам не придётся проводить никаких дополнительных шагов по инициализации библиотек. Создадим файл экспортируемых функций additor.exports, состоящий из 2-х строк: LibMain Библиотека компилируется следующим образом:
После выполнения этой команды будут созданы файлы main.dll и main.lib Как использовать полученную библиотеку? Напишем простенькую программу test.c (теоретически, можно и на Delphi).
double additor(double x, double y); void main() { printf('10+20=%f', additor(10,20);); } Скомпонуем теперь её с библиотекой main.lib Получится программа test.exe. Приведённую выше последовательность действий не стоит понимать буквально (однако, всё что написано выше было проделано на практике). Она лишь иллюстрирует идеи, которые позволяют добиться цели - создания stand-alone библиотеки, пригодной для использования из различных языков программирования. Заранее спасибо всем, кто откликнется и выскажет ценные замечания. С уважением, Алексей Селезнёв. |
|
Всероссийская научная конференция "Проектирование научных и инженерных приложений в среде MATLAB" (май 2002 г.)
|
||
| На первую страницу \ Сотрудничество \ MathWorks \ SoftLine \ Exponenta.ru \ Exponenta Pro | ||
| E-mail: | ||
| Информация на сайте была обновлена 11.05.2004 |
Copyright 2001-2004 SoftLine Co Наши баннеры |
|