Ограничения к разделяемой поддержке библиотеки

MATLAB поддерживает библиотечные подпрограммы C

MATLAB® совместно использовал поддержки интерфейса библиотеки C библиотечные подпрограммы только. Большинство профессионально составленных библиотек разработало, чтобы использоваться несколькими языками, и платформы хорошо работают. Для получения дополнительной информации смотрите Вызов C Функции в Разделяемых Библиотеках.

Многие некоммерческие библиотеки или библиотеки, которые были только протестированы с C++, имеют интерфейсы, которые не применимы и требуют модификации или интерфейсного уровня. В этом случае мы рекомендуем использовать файлы MEX.

Обходные решения для загрузки библиотек C++

Разделяемый интерфейс библиотеки не поддерживает элементы перегруженных функций или классы 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); 

Добавление файла определения модуля в Visual Studio

При создании 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.

Похожие темы

Была ли эта тема полезной?