coder.ceval
调用外部 C/C++ 函数
语法
说明
coder.ceval(
执行 cfun_name
)cfun_name
指定的外部 C/C++ 函数。在外部 C/C++ 源文件或库中定义 cfun_name
。将外部源代码、库和头文件提供给代码生成器。
coder.ceval(
使用参数 cfun_name
,cfun_arguments
)cfun_arguments
执行 cfun_name
。cfun_arguments
是按照 cfun_name
要求的顺序排列的逗号分隔的输入参数列表。
默认情况下,只要 C/C++ 支持按值传递参数,coder.ceval
就会按值向 C/C++ 函数传递参数。要使 coder.ceval
按引用传递参数,请使用 coder.ref
、coder.rref
和 coder.wref
构造。如果 C/C++ 不支持按值传递参数,例如说参数是一个数组,则 coder.ceval
将按引用传递参数。如果您不使用 coder.ref
、coder.rref
或 coder.wref
,则生成的代码中可能会出现参数的副本,以强制执行用于数组的 MATLAB® 语义。
coder.ceval(
执行 '-global'
,cfun_name
)cfun_name
,并指示 cfun_name
使用一个或多个 MATLAB 全局变量。然后,代码生成器可以产生与此全局变量用法一致的代码。
注意
只有代码生成中支持 -global
标志。在 MATLAB Function 模块中调用 coder.ceval
时,不能包含此标志。
coder.ceval(
使用参数 '-global'
,cfun_name
,cfun_arguments
)cfun_arguments
执行 cfun_name
,并指示 cfun_name
使用一个或多个 MATLAB 全局变量。
coder.ceval(
允许您从核内调用 CUDA® GPU '-gpudevicefcn'
,devicefun_name,devicefun_arguments)__device__
函数。'-gpudevicefcn'
向 coder.ceval
指示目标函数在 GPU 设备上。devicefun_name
是 __device__
函数的名称,devicefun_arguments
是按 devicefun_name
要求的顺序以逗号分隔的输入参数列表。此选项需要 GPU Coder™ 产品。
coder.ceval(
带参数 '-layout:rowMajor'
,cfun_name
,cfun_arguments
)cfun_arguments
执行 cfun_name
,并传递以行优先布局存储的数据。当从使用列优先布局的函数调用时,代码生成器将输入转换为行优先布局,并将输出转换回列优先布局。要获得更短的语法,请使用 coder.ceval('-row',...)
。
coder.ceval(
带参数 '-layout:columnMajor'
,cfun_name
,cfun_arguments
)cfun_arguments
执行 cfun_name
,并传递以列优先布局存储的数据。当从使用行优先布局的函数调用时,代码生成器将输入转换为列优先布局,并将输出转换回行优先布局。要获得更短的语法,请使用 coder.ceval('-col',...)
。
coder.ceval(
带参数 '-layout:any'
,cfun_name
,cfun_arguments
)cfun_arguments
执行 cfun_name
,并使用当前数组布局传递数据,即使数组布局不匹配也是如此。代码生成器不转换输入或输出数据的数组布局。
cfun_return = coder.ceval(___)
执行 cfun_name
并返回单个标量值 cfun_return
,它对应于 C/C++ 函数在 return
语句中返回的值。为了与 C/C++ 保持一致,coder.ceval
只能返回标量值。它不能返回数组。可以将此选项与上述语法中的任何输入参数组合一起使用。
示例
输入参数
限制
对于使用
coder.extrinsic
声明为外部函数的函数,不能使用coder.ceval
。当 LCC 编译器创建库时,它会向库函数名称添加一个前导下划线。如果库的编译器是 LCC,而您的代码生成编译器不是 LCC,则您必须向函数名称添加前导下划线,例如
coder.ceval('_mylibfun')
。如果库的编译器不是 LCC,而 MATLAB 代码从该库中调用函数,则您不能使用 LCC 从该代码中生成代码。这些库函数名称没有 LCC 编译器所要求的前导下划线。如果某属性具有 get 方法、set 方法或验证器,或者是具有某些特性的 System object™ 属性,则您不能按引用将该属性传递给外部函数。请参阅Passing By Reference Not Supported for Some Properties。
行优先代码生成不支持将可变大小矩阵作为入口函数参数。
提示
对于代码生成,您必须在调用
coder.ceval
之前指定返回值和输出参数的类型、大小和复/实性数据类型。要将
coder.ceval
应用于一个函数,而该函数接受或返回 MATLAB 代码中不存在的变量,如指针、用于文件 I/O 的FILE
类型和 C/C++ 宏,请使用coder.opaque
函数。coder.ceval
只能在 MATLAB 中用于代码生成。在未编译的 MATLAB 代码中,coder.ceval
将生成错误。要确定 MATLAB 函数是否在 MATLAB 中执行,请使用coder.target
。如果函数在 MATLAB 中执行,则调用 C/C++ 函数的 MATLAB 版本。使用
coder.ceval
调用的外部代码和生成的代码在同一个进程中运行,并共享内存。如果外部代码错误地写入包含生成的代码使用的数据结构体的内存,可能导致进程出现意外行为或崩溃。例如,如果外部代码尝试在其结束点后将数据写入数组,进程可能会出现意外行为或崩溃。MATLAB 在 Windows® 平台上使用 UTF-8 作为其系统编码。因此,从生成的 MEX 函数中进行的系统调用接受并返回 UTF-8 编码的字符串。相反,由 MATLAB Coder 生成的代码使用 Windows 区域设置指定的编码对文本数据进行编码。因此,如果您的 MATLAB 入口函数使用
coder.ceval
(MATLAB Coder) 来调用接受不同系统编码的外部 C/C++ 函数,则生成的 MEX 函数可能会产生乱码文本。如果发生这种情况,您必须更新外部 C/C++ 函数来处理这种情况。
扩展功能
版本历史记录
在 R2011a 中推出
另请参阅
coder.ref
| coder.rref
| coder.wref
| coder.target
| coder.extrinsic
| coder.opaque
| coder.updateBuildInfo
| coder.ExternalDependency
| coder.reservedName
(MATLAB Coder)