A.2.1 Начало работы с MEX-файлами ¶
Основная команда для создания MEX-файла — это либо mkoctfile --mex или mex. Первую команду можно использовать как изнутри Octave, так и из командной строки. Чтобы избежать проблем с собственной командой MATLAB’s mex, использование команды mex ограничено средой Octave. Скомпилированные MEX-файлы имеют расширение .mex.
-
: mex
[-options] file …¶ -
:
mexstatus=(…)¶ -
Компилирует исходный код на C, C++ или Fortran в MEX-файл.
status — это код возврата функции
mkoctfile.Если компиляция завершается неудачно, и значение выходного аргумента не запрашивается, возникает ошибка. Однако, если программист запросил status, Octave просто выведет предупреждение, и программисту необходимо самостоятельно проверить успешность команды.
Это эквивалентно
mkoctfile --mex [-options] file.
-
:
ext =mexext()¶ -
Возвращает расширение имени файла, используемого для MEX-файлов.
Примечание для программистов: Octave использует расширение mex для всех MEX-файлов независимо от операционной системы (Linux, Windows, Apple) или разрядности оборудования (32 или 64 бита).
См. также: mex.
Рассмотрим следующий короткий пример:
#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–2023 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/v9.2.0/Getting-Started-with-Mex_002dFiles.html