MATLAB® совместно использовал поддержки интерфейса библиотеки C библиотечные подпрограммы только. Большинство профессионально составленных библиотек разработало, чтобы использоваться несколькими языками, и платформы хорошо работают. Для получения дополнительной информации смотрите Вызов C Функции в Разделяемых Библиотеках.
Многие некоммерческие библиотеки или библиотеки, которые были только протестированы с C++, имеют интерфейсы, которые не применимы и требуют модификации или интерфейсного уровня. В этом случае мы рекомендуем использовать файлы MEX.
Разделяемый интерфейс библиотеки не поддерживает элементы перегруженных функций или классы C++. Однако, если у вас есть исходный код для библиотеки, можно применить одну из следующих стратегий загрузить библиотеку C++ с помощью loadlibrary
. После редактирования исходного кода восстановите библиотеку.
Объявление Функций как экстерна "C"
Например, следующий прототип функции из файла shrlibsample.h
показывает синтаксис, чтобы использовать для каждой функции:
#ifdef __cplusplus extern "C" { #endif void addMixedTypes( short x, int y, double z ); /* other prototypes may be here */ #ifdef __cplusplus } #endif
Следующим Кодом С++ не является легальный код С для заголовочного файла:
extern "C" void addMixedTypes(short x,int y,double z);
При создании DLL из Кода С++ в Microsoft® Visual Studio® добавьте Файл Определения Модуля (.DEF) в проекте. Как минимум файл DEF должен содержать следующие операторы определения модуля:
Первый оператор в файле должен быть оператором LIBRARY.
Оператор EXPORTS перечисляет имена и, опционально, порядковые номера функций, экспортируемых DLL.
Например, если DLL функции экспорта multDoubleArray
и addMixedTypes
, module.def
содержит:
LIBRARY EXPORTS multDoubleArray addMixedTypes
Ограничения Используя Функцию printf
MATLAB не отображает вывод функции printf
C к командному окну.
Можно изменить немного объявление поля при помощи типа int
или эквивалент. Например, если ваша библиотека имеет следующее, объявленное в его заголовочном файле:
int myfunction(); struct mystructure { /* note the sum of fields bits */ unsigned field1 :4; unsigned field2 :4; };
отредактируйте заголовочный файл и замените его на:
int myfunction(); struct mystructure { /* field 8 bits wide to be manipulated in MATLAB */ /* A char is 8 bits on all supported platforms */ char allfields; };
После редактирования исходного кода восстановите библиотеку. Затем возможно получить доступ к данным в этих двух полях с помощью побитового маскирования в MATLAB.
Определения char
для enum
не поддержаны. В C постоянный char
, например 'A'
, автоматически преобразован в его числовой эквивалент (65). MATLAB не преобразовывает константы. Чтобы использовать этот тип enum
, отредактируйте заголовочный файл, заменив 'A'
на номер 65 (int8('A') == 65
). Например, замена:
enum Enum1 {ValA='A',ValB='B'};
с:
enum Enum1 {ValA=65,ValB=66};
затем восстановите библиотеку.
Объединения не поддержаны. Как обходное решение, измените исходный код, вынув объявление union
и заменяющий его на самую большую альтернативу. Затем чтобы интерпретировать результаты, запишите код MATLAB по мере необходимости. Например, отредактируйте исходный код и замените следующее объединение:
struct mystruct { union { struct {char byte1,byte2;}; short word; }; };
с:
struct mystruct { short word; };
где на основанной на прямом порядке байтов машине, byte1
является mod(f,256)
, byte2
является f/256
и word=byte2*256+byte1
. После редактирования исходного кода восстановите библиотеку.
Заголовочные файлы должны быть совместимы с поддерживаемыми компиляторами на платформе. Актуальный перечень поддерживаемых компиляторов см. на сайте «Поддерживаемые и совместимые компиляторы». Вы не можете загрузить внешние библиотеки с явными зависимостями от других компиляторов.
Разделяемый интерфейс библиотеки не делает функций вспомогательной библиотеки, которые работают с указателями функции.
Ограниченная поддержка многоуровневых указателей и структур, содержащих указатели. Используя вводы и выводы и элементы структуры, объявленные больше чем с двумя уровнями абстракции, не поддержан. Например, double ***outp
, переведенный в doublePtrPtrPtr
, не поддержан.
Разделяемый интерфейс библиотеки не делает функций вспомогательной библиотеки с переменным количеством аргументов, представленных замещающим знаком (...
).
Можно создать несколько функций псевдонима в прототипном файле, один для каждого набора аргументов раньше вызывал функцию. Для получения дополнительной информации смотрите Прототипные Файлы MATLAB.