Main Content

本页翻译不是最新的。点击此处可查看最新英文版本。

mex

编译 MEX 函数或引擎应用程序

说明

示例

mex filenames 编译一个或多个用 MATLAB Data API for C++ 编写的 C++ 源文件并将其链接到当前文件夹中的二进制 MEX 文件中。有关编写这些应用程序的信息,请参阅 编写可从 MATLAB(MEX 文件)调用的 C++ 函数

如果基于C Matrix APIFortran Matrix API编写 MEX 文件,则 mex filenames 使用 -R2017b api 编译一个或多个 C、C++ 或 Fortran 源文件。在以后的 MATLAB® 版本中,默认的 api 选项将改用交错式复矩阵 API (-R2018a)。MathWorks 建议您新建 MEX 文件或更新现有 MEX 文件,以使用交错式复矩阵 API。也可以使用 MX_HAS_INTERLEAVED_COMPLEX 宏在各个版本的 MATLAB 中应用预期行为。有关详细信息,请参阅MATLAB Support for Interleaved Complex API in MEX Functions

有关使用 C、C++ 和 Fortran 应用程序的信息,请参阅将 MATLAB 与外部编程语言和系统集成

示例

mex filenames api option1 ... optionN 使用指定的 api 和可选的 option1 ... optionN 参量进行编译。option1 ... optionN 参量补充或覆盖默认 mex 编译配置。

mex -client engine filenames 将使用 MATLAB Data API for C++ 编写的 C++ 源文件编译到独立的 MATLAB 引擎应用程序中。有关详细信息,请参阅Elements of a C++ Engine Program

如果基于MATLAB Engine API for CC MAT 文件 APIFortran Engine APIFortran MAT 文件 API 编写应用程序,则 mex -client engine filenames 使用 -R2017b api 编译独立应用程序。在以后的 MATLAB 版本中,默认的 api 选项将改用交错式复矩阵 API (-R2018a)。MathWorks 建议您创建新引擎应用程序并更新现有应用程序,以使用交错式复矩阵 API。

mex -client engine filenames api option1 ... optionN 使用指定的 api 和可选的 option1 ... optionN 参量编译引擎应用程序。

mex -setup [lang] 显示用于编译 MEX 文件的给定语言的默认编译器的有关信息。MATLAB 为每种支持的语言定义一个默认编译器。如果某种给定语言有多个编译器,请使用 lang 选项更改该语言的默认编译器。有关详细信息,请参阅更改默认编译器选择 C++ 编译器

mex -setup -client engine [lang] 选择用来编译引擎应用程序的编译器。

示例

全部折叠

matlabroot/extern/examples 文件夹复制源代码示例。

copyfile(fullfile(matlabroot,'extern','examples','mex','explore.c'),'.','f')

编译该 MEX 文件。输出显示特定于您的编译器的信息。

mex -R2018a explore.c

通过传递复矩阵来测试函数。

a = [1 3 5];
b = [5 3 1];
A = complex(a,b);
explore(A)
------------------------------------------------
Name: prhs[0]
Dimensions: 1x3
Class Name: double
------------------------------------------------
	(1,1) = 1 + 5i
	(1,2) = 3 + 3i
	(1,3) = 5 + 1i

将单个 C 程序 yprime.c 编译为一个 MEX 文件。

matlabroot/extern/examples 文件夹复制源代码示例。

copyfile(fullfile(matlabroot,"extern","examples","mex","yprime.c"),".","f")

编译该 MEX 文件。输出显示特定于您的编译器的信息。

mex yprime.c
Building with 'Microsoft Visual C++ 2019 (C)'.
MEX completed successfully.

测试。

T=1;
Y=1:4;
yprime(T,Y)
ans = 1×4

    2.0000    8.9685    4.0000   -1.0947

要显示编译和链接命令及其他用于故障排除的信息,请使用详尽模式。输出显示特定于您的平台和编译器的信息。

mex -v -compatibleArrayDims yprime.c

使用环境变量指定要传递给编译器的附加选项。

确定变量名称:

  • 要使用 MinGW®macOS 和 Linux® 编译器编译 C++ 代码,请使用 CXXFLAGS

  • 要使用 MinGW、macOS 和 Linux 编译器编译 C 代码,请使用 CFLAGS

  • 对于 Microsoft® Visual Studio® 编译器,请使用 COMPFLAGS

使用 Visual Studio 编译 MEX 文件时,请指定 C++17 标准。

mex COMPFLAGS='$COMPFLAGS -std=c++17' yprime.c

有关在不同平台上使用字符串分隔符的详细信息,请参阅覆盖默认编译器开关选项

通过将值 -Wall 追加到现有编译器标志来编译 yprime.c 对应的 MEX 文件。因为该值包括空格字符,所以您必须界定该字符串;界定所用字符取决于平台。

在 MATLAB 提示符处,使用单引号 (')。

mex -v COMPFLAGS='$COMPFLAGS -Wall' yprime.c

对于基于 gcc/g++ 的 MinGW-w64 编译器,请使用 Linux 编译器标识符。选择以下命令之一:

mex -v CXXFLAGS='$CXXFLAGS -Wall' yprime.c % C++ compiler
mex -v CFLAGS='$CFLAGS -Wall' yprime.c     % C compiler 

在 Windows® 命令提示符处,使用双引号 (")。

mex -v COMPFLAGS="$COMPFLAGS -Wall" yprime.c

macOS 和 Linux 上的 Shell 命令行处,使用单引号 (')。

mex -v CFLAGS='$CFLAGS -Wall' yprime.c

MEX 文件示例 fulltosparse 由两个 Fortran 源文件 loadsparse.Ffulltosparse.F 组成。要运行此示例,您需要在您的系统上安装支持的 Fortran 编译器。

将源文件复制到当前文件夹。

copyfile(fullfile(matlabroot,'extern','examples','refbook','loadsparse.F'),'.','f')
copyfile(fullfile(matlabroot,'extern','examples','refbook','fulltosparse.F'),'.','f')

编译 fulltosparse MEX 文件。MEX 文件名为 fulltosparse,这是因为 fulltosparse.F 是命令行上的第一个文件。输出包含特定于您的编译器的信息。

mex -largeArrayDims fulltosparse.F loadsparse.F
Building with 'Intel Visual Fortran Composer XE 2013 with Microsoft Visual Studio 2012'.
MEX completed successfully.

测试。

full = eye(5);
spar = fulltosparse(full)
spar =

    1,1         1
    2,2         1
    3,3         1
    4,4         1
    5,5         1

将当前文件夹中的所有 C 源文件组合为 MEX 文件 mymex。使用 -output 选项控制 MEX 文件的名称。

mex -output mymex *.c

在不执行命令的情况下,使用 -n 选项可预览编译命令详细信息。输出显示特定于您的平台和编译器的信息。

mex -n yprime.c

您可以链接到与源 MEX 文件分开编译的目标文件。

MEX 文件示例 fulltosparse 由两个 Fortran 源文件组成。fulltosparse 文件是入口例程(包含 mexFunction 子例程),loadsparse 包含计算例程。

要运行此示例,您需要在您的系统上安装支持的 Fortran 编译器。将计算子例程复制到当前文件夹。

copyfile(fullfile(matlabroot,'extern','examples','refbook','loadsparse.F'),'.','f')

编译子例程,并将目标文件放在单独的文件夹 c:\objfiles 中。

mkdir c:\objfiles
mex -largeArrayDims -c -outdir c:\objfiles loadsparse.F
Building with 'Intel Visual Fortran Composer XE 2013 with Microsoft Visual Studio 2012'.
MEX completed successfully.

将入口子例程复制到当前文件夹。编译 loadsparse 目标文件并与之链接。

copyfile(fullfile(matlabroot,'extern','examples','refbook','fulltosparse.F'),'.','f')
mex -largeArrayDims fulltosparse.F c:\objfiles\loadsparse.obj
Building with 'Intel Visual Fortran Composer XE 2013 with Microsoft Visual Studio 2012'.
MEX completed successfully.

要指定包含 MATLAB LAPACK 库子例程以处理复数例程的路径,请使用 -I 选项。要使用这些子例程,您的 MEX 文件必须访问头文件 fort.h

matrixDivideComplex.c 示例复制到当前文件夹。

copyfile(fullfile(matlabroot,'extern','examples','refbook','matrixDivideComplex.c'),'.','f')

通过串联 '-I'fort.h 文件的路径来创建 -I 参量。

ipath = ['-I' fullfile(matlabroot,'extern','examples','refbook')];

为 LAPACK 库文件和文件 fort.c 的名称和路径创建变量,这些变量包含复数处理例程。

lapacklib = fullfile(matlabroot,'extern','lib',computer('arch'),'microsoft','libmwlapack.lib');
fortfile = fullfile(matlabroot,'extern','examples','refbook','fort.c');

编译该 MEX 文件。

mex('-v','-R2017b',ipath,'matrixDivideComplex.c',fortfile,lapacklib)

通过使用 -L-l 选项指定 libmwlapack.lib 库,在 Windows 平台上编辑 matrixDivide.c 示例。库文件位于文件夹 matlabroot\extern\lib\arch\microsoft 中。

matrixDivide.c 示例复制到当前文件夹。

copyfile(fullfile(matlabroot,'extern','examples','refbook','matrixDivide.c'),'.','f')

捕获此语句显示的 matlabroot 的值,以便在 mex 命令中使用。

matlabroot
ans =

C:\Program Files\MATLAB\R2014a

捕获此语句显示的 arch 的值,以便在 mex 命令中使用。

computer('arch')
ans =

win64

要编译 MEX 文件,请将 matlabrootarch 的值复制到 mex 命令中。

mex '-LC:\Program Files\MATLAB\R2014a\extern\lib\win64\microsoft' ...
   -llibmwlapack matrixDivide.c

您必须使用 ' 字符,这是因为路径中的 \Program Files 包括一个空格。

mxcreatecharmatrixfromstr.c 示例使用 #define 符号 SPACE_PADDING 来确定要在矩阵的字符向量之间使用的字符。要设置该值,请使用 -D 选项编译 MEX 文件。

将示例复制到当前文件夹。

copyfile(fullfile(matlabroot,'extern','examples','mx','mxcreatecharmatrixfromstr.c'),'.','f')

SPACE_PADDING 指令设置为在值之间添加空格。

mex mxcreatecharmatrixfromstr.c -DSPACE_PADDING
Building with 'MinGW64 Compiler  C '.
MEX completed successfully.

engwindemo.c 引擎示例复制到当前文件夹。

copyfile(fullfile(matlabroot,'extern','examples','eng_mat','engwindemo.c'),'.','f')

使用 -client engine 语法编译独立的 MATLAB 引擎应用程序。

mex -client engine engwindemo.c

如果您在 Windows 平台上运行,则必须先将 MATLAB 注册为 COM 服务器。有关详细信息,请参阅Register MATLAB as a COM Server

运行示例。

!engwindemo
mex -setup

MATLAB 根据支持和兼容的编译器列表显示适用于您的版本和系统的选项。

要向 mex 链接命令添加选项,请使用 LINKFLAGS 命令行选项。例如,要指定在 Windows 上编译 mymex.c 时可执行文件的环境,请键入:

mex -v LINKFLAGS='$LINKFLAGS /subsystem:windows' mymex.c

输入参数

全部折叠

一个或多个文件名,包括名称和文件扩展名,指定为字符串或字符向量。如果文件不在当前文件夹中,请指定该文件的完整路径。

文件名可以是以下项的任意组合:

  • C、C++ 或 Fortran 源文件。

  • Simulink® S-Function 文件。

  • 目标文件。

  • 静态库文件。filenames 必须包含库文件的完全限定路径。该库必须使用 mex 当前使用的同一编译器进行编译。

    要链接动态库,请使用 -llibname 选项。

filenames 中列出的第一个源代码文件是该二进制 MEX 文件或引擎应用程序的名称。要覆盖此命名约定,请使用 -output 选项。

使用 MATLAB 编辑器编写源代码。如果您使用集成开发环境 (IDE),例如 Microsoft Visual StudioXcode,则您可以使用 mex 命令或遵循Custom Build with MEX Script Options中的规范。

MATLAB 基于 filenames 参量的语言自动选择一个编译器(如果已安装)。

使用特定于版本的 C Matrix APIFortran Matrix API 进行链接,指定为下表中的值之一。请勿将这些选项组合使用。

不要将此选项用于使用 MATLAB Data API for C++ 的 MEX 文件或引擎应用程序。

API描述

-R2017b(默认值)

通过以下方式进行编译:

  • 分离式复矩阵 API,包含 MATLAB R2017b 及更早版本中的 C 和 Fortran 矩阵 API 功能。

  • 大型数组处理 API,用于处理元素数目超过 231–1 个的数组。

  • 将图形对象的句柄视为 object,而不是 double

在以后的 MATLAB 版本中,默认的 api 选项将改用交错式复矩阵 API (-R2018a)。MathWorks 建议您创建新应用程序并更新现有应用程序,以使用交错式复矩阵 API。也可以使用 MX_HAS_INTERLEAVED_COMPLEX 宏在各个版本的 MATLAB 中应用预期行为。有关详细信息,请参阅MATLAB Support for Interleaved Complex API in MEX Functions

-R2018a

通过以下方式进行编译:

要在 R2018a 中运行使用交错式复矩阵 API 编译的 Fortran MEX 文件,您必须使用 R2018a Update 3。

-largeArrayDims

通过以下方式进行编译:

  • 分离式复矩阵 API

  • 大型数组处理 API

  • 将图形对象的句柄视为 object,而不是 double。要将句柄视为 double,请将此选项与 -DMEX_DOUBLE_HANDLE 结合使用。

-compatibleArrayDims

通过以下方式进行编译:

  • 分离式复矩阵 API

  • 使用版本 7.2 数组处理 API,它将数组限制为不超过 231–1 个元素

  • 将图形对象的句柄视为 object,而不是 double。要将句柄视为 double,请将此选项与 -DMEX_DOUBLE_HANDLE 结合使用。

调用 LAPACK 或 BLAS 函数 时,不要使用 -compatibleArrayDims 选项。

仅适用于 C MEX S-Function 的默认选项。

示例: mex -R2018a explore.c

可选的编译选项,指定为下表中的值之一。除非另有说明,否则选项可在任意平台上按任意顺序出现。

选项描述

@rspfile

使用 Windows RSP 文件。RSP 文件是包含命令行选项的文本文件。不支持非 ASCII 字符。

-c

仅编译目标文件。不要编译二进制 MEX 文件。

-client engine

编译引擎应用程序。

-Dsymbolname
-Dsymbolname=symbolvalue
-Usymbolname

-D 选项定义 C 预处理器宏。等效于源文件中的以下符号:

  • #define symbolname

  • #define symbolname symbolvalue

-U 选项删除 C 预处理器宏 symbolname 的任何初始定义。-D 选项的反选。

不要在 DUsymbolname 之间添加空格。不要在 = 符号前后添加空格。

示例:定义编译器指令

-f filepath

覆盖默认编译器选择。filepath 是配置文件的名称和完整路径,指定为字符串或字符向量。有关使用非默认编译器的信息,请参阅更改默认编译器

不要使用 -f 选项来编译引擎应用程序。改用 -client engine 选项。

-g

添加符号信息并禁用对编译的目标代码的优化。用于调试。

-h[elp]

显示 mex 的帮助。在操作系统提示符环境下使用。

-Ipathname

pathname 添加到文件夹列表以搜索 #include 文件。

不要在 Ipathname 之间添加空格。

示例:指定包含文件的路径

-llibname
-Llibfolder -llibname

libfolder(可选)中的动态对象库 libname 的链接。

MATLAB 将 libname 扩展为:

  • libname.libliblibname.lib - Windows 系统

  • liblibname.dylib - macOS 系统

  • liblibname.so - Linux 系统

如有使用,-L 选项必须位于 -l 选项之前。在 Linux 或 macOS 系统上使用 -L 选项时,您还必须设置运行时库路径,如Set Run-Time Library Path中所述。

使用 L 的小写字母指定 -l 选项。不要在 llibname 之间或 Llibfolder 之间添加空格。

要链接静态库,请使用 filenames 输入参量。

示例:指定库文件的路径

-n

显示但不执行命令,将由 mex 执行。

示例:预览编译命令

-O

优化目标代码。使用此选项执行优化编译。默认情况下,优化处于启用状态。

使用大写字母 O 指定此选项。

-outdir dirname

将所有输出文件放在文件夹 dirname 中。

例如:创建并链接到单独的目标文件

-output mexname

覆盖默认的 MEX 文件命名机制。创建具有相应 MEX 文件扩展名且名称为 mexname 的二进制 MEX 文件。

示例:使用通配符组合源文件

-setup lang

更改用于编译 lang 语言 MEX 文件或引擎应用程序的默认编译器。当您使用此选项时,mex 将忽略所有其他命令行选项。

-silent

隐藏信息性消息。在您指定 -silent 时,mex 命令仍会报告错误和警告。

-Usymbolname

删除 C 预处理器宏 symbolname 的任何初始定义。(-D 选项的反选。)

不要在 Usymbolname 之间添加空格。

-v

在详尽模式下编译。在考虑所有命令行参量后显示内部变量的值。显示每个编译步骤和链接步骤的详细计算信息。用于排查编译器设置问题。

示例:显示详细编译和故障排除信息

varname=varvalue

向环境变量 varname 追加值。在考虑所有命令行参量后处理此选项。

示例:

语言,指定为下列不区分大小写的值之一。

C

C 编译器,包括 C++。

C++CPP

C++ 编译器

Fortran

Fortran 编译器

提示

  • 您可以从以下位置运行 mex

    • MATLAB 命令行窗口

    • Windows 系统提示符

    • macOS 终端

    • Linux Shell

    要在 MATLAB 之外使用命令行,请访问由 [matlabroot '/bin'](UNIX 平台上)或 [matlabroot '\bin\win64'](Windows 平台上)所指定文件夹中的 mex 程序。

  • MEX 文件具有与平台相关的扩展名。您可以将适用于不同平台的多个二进制 MEX 文件放在同一个文件夹中。要标识 MEX 文件扩展名,请使用 mexext 函数。

    MEX 文件与平台相关的扩展名

    平台二进制 MEX 文件扩展名

    Windows

    mexw64

    Linux

    mexa64

    采用 Apple 芯片的 macOS

    mexmaca64

    采用 Intel®macOS

    mexmaci64

    注意

    使用 Rosetta 2 的 Apple 芯片平台不支持使用 Intel 在 macOS 上编译的 MEX 文件。

  • 要使用 mex 为独立 MATLAB 引擎应用程序编译可执行文件,请使用 -client engine 选项。

  • mex 命令不支持包含双引号 (") 字符的文件夹名称。

版本历史记录

在 R2006a 之前推出

全部展开