VS中调用Matlab封装的库文件

VS中调用Matlab封装的库文件

  • 简介

    由于项目需要,要编写多线程实现功能,但Matlab天生多线程缺陷,查相关资料,可以通过Timer对象实现,但考虑到C++程序的高效性,且一直在使用C++,故决定将Matlab编译成C++可以调用的库文件,然后在VS下面调用Matlab程序,下面是在Matlab封装成库文件,以及VS调用Matlab库文件详细过程。

  • 环境

    系统:Win7(64位)、Matlab 2014Ra、VS2012

  • 步骤

    1)将Matlab中的.m文件编译成对应C++的库文件

    Matlab编译简介

    将Matlab中的.m文件编译成对应的C++库文件,需要利用对应的编译器mbuild。下面简要介绍一下mcc、mbuild、mex:

    • mcc:将.m文件转换成C/C++文件和相应的Mex包裹文件(需要Matlab编辑器),但在特定条件下可以自动调用mbuild或者mex;
    • mex:将C/C++文件(入口函数为mexfunction())编译成mex(dll)文件(需要C/C++编辑器);
    • mbuild:将C/C++文件(入口函数为main())生成可独立运行的C应用程序(需要C/C++编辑器);

    设置Matlab编译环境

    安装mbuild,具体在Matlab命令控制台中输入如下命令:

    mex -setup
    

    然后选择与自己VS编译器相对应的编译器,选择C++编译环境即可。

    使用mcc命令编译.m文件

    编译要使用的matlab程序中.m对应的库文件,使用如下命令:

    mcc -v -W cpplib:libname -T link:lib name.m
    

    其中libname:为自己编译后的库名;name.m为对应所要封装成库的.m文件。

    注意:开始在使用如上命令进行编译时,一直报如下错误:Test checkout of feature ‘Compiler’ failed,主要原因是安装的compiler破解不完全导致的,解决方法见如下网页:
    http://blog.csdn.net/smilebluesky/article/details/42987985

    编译完成检查

    编译完成后,将多出9个文件,分别为如下信息:libname.dll、libname.lib、libname.h、libname.cpp、libname.def、libname.exp、libname.exports、mccExcludeFiles.log、readme.txt。

    虽然生成了9个文件,但在VS中只需要使用其中的三个文件,分别为:libname.h、libname.dll、libname.dll。

    2)在VS2012下调用Matlab程序

    在VS建立控制台的空项目

    配置项目属性

    VC++包含目录,主要是Matlab安装目录下的include目录和自己编译的库目录,具体如下:

    E:\Program Files\MATLAB\R2014a\extern\include\win64
    
    E:\Program Files\MATLAB\R2014a\extern\include
    
    自己编译的头文件目录,按照自己实际存放的位置来填写即可。
    

    VC++库目录,主要是Matlab安装目录下的lib目录,具体如下:

    E:\Program Files\MATLAB\R2014a\bin\win64
    
    E:\Program Files\MATLAB\R2014a\extern\lib
    
    E:\Program Files\MATLAB\R2014a\extern\lib\win32\microsoft
    
    E:\Program Files\MATLAB\R2014a\extern\lib\win32\lcc
    
    E:\Program Files\MATLAB\R2014a\extern\lib\win64\microsoft
    
    自己编译的库文件目录,按照自己实际存放的位置来填写
    

    C/C++常规

    E:\Program Files\MATLAB\R2014a\extern\lib\win64\microsoft
    

    链接器,添加依赖库,具体如下:

    libeng.lib、libmat.lib、libmex.lib、libmx.lib、mclmcrrt.lib、mclmcr.lib、libname.lib
    

    注意:上面的环境的配置时,有一些是可以没有,主要还是要看VS下建立的项目时32位的还是64位的,可以根据具体情况进行配置。此外上面自己编译的库可以不用填写相应的目录,但是这种情况下,需要将对应libname.dll、libname.h、libname.lib三个文件放在自己项目的目录下。

    添加头文件并写main函数

    在建立的项目中导入头文件,利用导入现有项目即可实现。然后编写对应的调用main文件即可。主要main函数中调用Matlab中的库文件,需要使用对应的输入输出参数对象,主要为mwArray等。

    注意:代入自己编译生成的.h文件,可能出现一定的错误,如”const char *” 类型的实参与 “LPCWSTR” 类型的形参不兼容,此错误对应的是编码集的问题,VS中默认的编码集为Unicode编码,将其改为使用多字节字符集即可。具体为:项目->属性->配置属性->常规->字符集,更改即可。

  • 参考文献

    http://blog.csdn.net/leixiaohua1020/article/details/38318517

    http://blog.sina.com.cn/s/blog_4a0824490102v5ga.html

    http://blog.csdn.net/smilebluesky/article/details/42987985

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要在C#调用MATLAB封装的DLL,需要以下步骤: 1. 在MATLAB编写并编译DLL,确保它可以在MATLAB正常运行。可以使用命令行函数“mcc”来编译MATLAB代码并生成DLL。 2. 在C#项目添加对生成的DLL的引用。右键单击项目,选择“添加引用”,然后浏览到DLL文件并选择它。 3. 在C#代码引入相关的命名空间,如“MathWorks.MATLAB.NET.Arrays”、“MathWorks.MATLAB.NET.Utility”和“MathWorks.MATLAB.NET.ComponentRuntime”。 4. 创建MATLAB的COM对象或.NET程序集对象,并使用它们来调用DLL的函数。可以使用“Type.GetTypeFromProgID”函数来创建COM对象,或使用“Assembly.LoadFile”函数来加载.NET程序集对象。 5. 调用DLL的函数并处理返回值。可以使用“MLArray”类来处理从DLL返回的MATLAB数组。 下面是一个示例代码,演示如何在C#调用MATLAB封装的DLL: ```csharp using System; using MathWorks.MATLAB.NET.Arrays; using MathWorks.MATLAB.NET.Utility; using MathWorks.MATLAB.NET.ComponentRuntime; namespace MyNamespace { class MyClass { static void Main(string[] args) { // Create MATLAB COM object Type matlabType = Type.GetTypeFromProgID("Matlab.Application"); dynamic matlab = Activator.CreateInstance(matlabType); // Load MATLAB-generated DLL AssemblyLoader loader = new AssemblyLoader(); loader.AddPath(@"C:\path\to\dll"); Assembly assembly = loader.Load("MyDLL"); // Call DLL function dynamic myFunction = assembly.CreateInstance("MyNamespace.MyClass"); MWArray result = myFunction.MyMethod(new MWNumericArray(1), new MWNumericArray(2)); // Process result double[] output = (double[])result.ToArray(typeof(double)); Console.WriteLine(output[0]); } } } ``` 这个例子假设你的DLL文件名为"MyDLL.dll",包含一个名为"MyClass"的类,其有一个名为"MyMethod"的函数,接受两个数字参数并返回一个数字结果。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值