A.2.1 Начало работы с Mex-файлами
Основная команда для построения mex-файла — либо mkoctfile --mex , либо mex. Первую команду можно использовать как изнутри Octave, так и из командной строки. Чтобы избежать проблем с собственным mex MATLAB, использование команды mex ограничено использованием внутри Octave. Скомпилированные mex-файлы имеют расширение .mex.
- : mex [-options] file … ¶
-
:
status= mex (…) ¶ -
Компилирует исходный код, написанный на C, C++ или Fortran, в MEX-файл.
status — это возвращаемый код функции
mkoctfile.Если компиляция завершается ошибкой, и аргумент возврата не затребован, возникает ошибка. Однако, если программист запрашивает status, Octave лишь выведет предупреждение, и программист обязан самостоятельно проверить успешность команды.
Это эквивалентно
mkoctfile --mex [-options] file.
Рассмотрим следующий короткий пример:
#include "mex.h"
void
mexFunction (int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[])
{
mexPrintf ("Hello, World!\n");
mexPrintf ("I have %d inputs and %d outputs\n", nrhs, nlhs);
/* Return empty matrices for any outputs */
int i;
for (i = 0; i < nlhs; i++)
plhs[i] = mxCreateDoubleMatrix (0, 0, mxREAL);
} Первая строка #include "mex.h" делает доступными все определения, необходимые для mex-файла. Важное отличие между Octave и MATLAB состоит в том, что заголовочный файл "matrix.h" неявно включается через включение "mex.h". Это необходимо, чтобы избежать конфликта с файлом Octave "Matrix.h" для операционных систем и компиляторов, которые не различают имена файлов в верхнем и нижнем регистре.
Точка входа в mex-файл определяется mexFunction. Функция принимает четыре аргумента:
- Количество возвращаемых аргументов (# левых аргументов).
- Массив указателей на возвращаемые аргументы.
- Количество входных аргументов (# правых аргументов).
- Массив указателей на входные аргументы.
Обратите внимание, что определение имени функции не включено явно в mexFunction, поэтому в одном файле может быть только одна mexFunction точка входа. Вместо этого имя функции, видимое в Octave, определяется именем самого mex-файла без расширения. Если указанная выше функция находится в файле myhello.c, её можно скомпилировать командой
mkoctfile --mex myhello.c
что создаст файл myhello.mex. Затем функцию можно запустить из Octave так:
myhello (1,2,3) ⇒ Hello, World! ⇒ I have 3 inputs and 0 outputs
Следует отметить, что mex-файл не содержит строки справки. Для документирования mex-файлов должен существовать m-файл в той же директории, что и сам mex-файл. Взяв вышеприведённый пример, потребуется файл myhello.m, который может содержать текст
%MYHELLO Simple test of the functionality of a mex-file.
В этом случае функция, которая будет выполняться в Octave, определяется mex-файлом, в то время как строка справки поступает из m-файла. Это также может быть полезно для предоставления примерного реализации mex-файла на языке Octave для целей тестирования.
Хотя в одном mex-файле не может быть нескольких точек входа, можно использовать функцию mexFunctionName для определения имени, под которым был вызван mex-файл. Это может быть использовано для изменения поведения mex-файла в зависимости от имени функции. Например, если
#include "mex.h"
void
mexFunction (int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[])
{
const char *nm;
nm = mexFunctionName ();
mexPrintf ("You called function: %s\n", nm);
if (strcmp (nm, "myfunc") == 0)
mexPrintf ("This is the principal function\n", nm);
return;
} находится в файле myfunc.c и скомпилировано командой
mkoctfile --mex myfunc.c ln -s myfunc.mex myfunc2.mex
то, как видно из
myfunc ()
⇒ You called function: myfunc
This is the principal function
myfunc2 ()
⇒ You called function: myfunc2 поведение mex-файла может изменяться в зависимости от имени функции.
Хотя пользователь должен включать только mex.h в свой код, Octave объявляет дополнительные функции, определения типов и т. д., доступные пользователю для написания mex-файлов в заголовках mexproto.h и mxarray.h.
© 1996–2022 The Octave Project Developers
Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies.
Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one.Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions.
https://docs.octave.org/v7.2.0/Getting-Started-with-Mex_002dFiles.html