Matlab调用动态链接库


matlab帮助文档里有详细文档Call Functions in shared Libaries

什么是共享库

共享库是一组函数的集合,在程序运行期间可以动态加载。共享库中的函数可以用不同的语言实现,但只要这些函数提供了C语言接口,那Matlab就支持该共享库,而且Matlab支持在不同平台下链接共享库。

平台

 

共享库 文件扩展名
Micsoft Windows 动态链接库文件 .dll
UNIX and Linus 共享目标文件 .so
Apple Macintosh 动态共享文件 .dylib

 

 

 

 

 

 

 

 

共享库必须要提供一个头文件,用来声明共享库中的函数。函数签名中明确了函数的名称,参数的个数和类型。

你还需要一个已安装好的matlab支持的C编译器。

matlab可以通过命令行接口调用外部共享库中的函数。这个接口允许你将一个外部共享库加载到Matlab内存中,并调用共享库中的函数。虽然matlab语言和C语言差异较大,但是通常你可以直接传递一个类型到C函数中,不需要做转换,因为matlab在后面已经帮你做好了这部分工作。

当你使用完了共享库,有个重点是你需要卸载共享库以释放内存。

加载和卸载共享库

为了让matlab调用共享库中的函数,首先需要将共享库加载到内存中去,加载完之后,你可以获取库中的函数信息和直接在matlab中调用这些函数,当不再需要共享库时,还需要卸载共享库来维持内存使用情况。

加载共享库到matlab中,使用loadlibray函数,函数语法是:

loadlibrary('shrlib','hfile')

其中shrlib表示共享库文件的名称,hfile表示包含函数声明的头文件名称。

unloadlibrary命令去卸载共享库并释放内存。命令语法:

unloadlibrary libname

其中libname表示共享库名称。

查看共享库函数

在命令行窗口中查看函数

为了在命令行窗口中显示共享库中的函数信息,可以用libfunctions,例如,查看libmx共享库中有哪些可用的函数,可以输入如下命令:

if not(libisloaded('libmx'))
  hfile = [matlabroot '\extern\include\matrix.h'];
  loadlibrary('libmx',hfile)
end
libfunctions libmx

matlab命令行窗口中显示:

MATLAB displays (in part):

Functions in library libmx:

mxAddField                         mxGetScalar
mxArrayToString                    mxGetString_730
mxCalcSingleSubscript_730          mxGetUserBits
mxCalloc                           mxIsCell
mxCreateCellArray_730              mxIsChar
mxCreateCellMatrix_730             mxIsClass
       .                               .
       .                               .
       .                               .

如果想看具体的函数签名,在命令后加-full指令,这个选项能够显示matlab调用共享库中函数的语法,其中函数用的参数列表和返回类型均为matlab类型,而不是C版本的类型。可输入如下命令:

list = libfunctions('libmx','-full')

matlab显示(部分):

MATLAB displays (in part):

list = 

'[int32, MATLAB array, cstring] mxAddField(MATLAB array, cstring)'
'[cstring, MATLAB array] mxArrayToString(MATLAB array)'
'[uint64, MATLAB array, uint64Ptr] mxCalcSingleSubscript_730(
 MATLAB array, uint64, uint64Ptr)'
'lib.pointer mxCalloc(uint64, uint64)'
'[MATLAB array, uint64Ptr] mxCreateCellArray_730(uint64, uint64Ptr)'
'MATLAB array mxCreateCellMatrix_730(uint64, uint64)'
         .
         .
         .

在窗口中查看函数

为了得到共享库中的函数信息,还可以用libfunctionview函数,matlab将会打开一个窗口显示如下信息:

Heading 描述
Return Type 函数返回类型
Name 函数名称
Arguments 输入参数的有效类型

查看libmx共享库中的函数信息,可以输入如下命令:

if not(libisloaded('libmx'))
  hfile = [matlabroot '\extern\include\matrix.h'];
  loadlibrary('libmx',hfile)
end
libfunctionsview libmx

matlab会弹出如下窗口:

需要注意的是,上述的参数类型和函数返回类型均为matlab类型,不是C版本类型。

调用共享库中函数

当加载完共享库后,可以用calllib函数来调用共享库中的函数了,函数语法为:

calllib('libname','funcname',arg1,...,argN)

指定共享库名称,函数名称,如果有要求的话,还包括所有传递到函数中参数。下面的实例可以调用libmx库中的函数。首选加载共享库:

if not(libisloaded('libmx'))
  hfile = [matlabroot '\extern\include\matrix.h'];
  loadlibrary('libmx',hfile)
end

创建一个数组y:

y = rand(4,7,2);

调用共享库中的函数,获取数组y的信息:

calllib('libmx','mxGetNumberOfElements',y)

matlab显示数组的个数:

ans =
    56

调用共享库中的函数,获取数组y的信息:

calllib('libmx','mxGetClassID',y)

matlab显示数组的类型:

ans =
   mxDOUBLE_CLASS

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM