1、安装MatLab6.5主要是为了得到MatLab数学库的头文件.dll文件和.lib文件,当然可以从其它电脑上把包含这些文件的文件夹拷过来用,具体是哪些文件夹,后面会说到。
2、建好了.dll(Dynamic-Link Library的简称)项目之后,首先要做就是进行包含目录设置:“工具”—>“先项”—>“目录”—>“目录[S]”在这个下接框中选“Include files”项进行头文件库设置,在下面的文本框中输入要需要的头文件的所在的文件夹目录(这样设置之后,在需要的时候,编译器就会这些目录下在查找头文件),这里应该输入是D:\MatLab6dot5\extern\include\cpp和D:\MatLab6dot5\extern\include。当然,我把MatLab6.5装到了D盘的MatLab6dot5目录下了。所以,从这里就可以看出,我们所需的头文件就存在这两个文件夹中,那么如果没有装MatLab的话,就拷贝这两个文件夹就行了(对.h/.hpp文件来说)。然后再选中“目录[S]”下接框中的"Library files"进行.lib文件库设置,其方法和“Include files”的设置道理是一样的,这里应该输入的文件夹是D:\MatLab6dot5\extern\lib\win32\microsoft\msvc60和D:\MatLab6dot5\extern\lib\win32。
3、需要说明的是,第3步的设置是属于编译器的,也就是说,第3步的设置只需要设一次VC6.0就会铭记于心了。而在这一步要进行的设置是工程设置,这个设置是针对具体的工程的,所以,每一个要调用MatLab数学库的函数都要进行这一设置:“工程”—>“设置”把开“Project Settings”对话框,然后在对话框中的
1)"c/c++"—>"分类"下拉框中选“预处理器”在“预处理器定义”文本框中增加MSVC,IBMPC,MSWIND这三个指令。
2)"c/c++"—>"分类"下拉框中选“Code Generation”,在“Use run time library”下拉框中选中“Multithreaded DLL”。
3)“连接”—>“对像/库模块”文件框中增加libmatpm.lib libmmfile.lib libmatlb.lib libmat.lib libmx.lib 这个静态库。
说明一下这段代码:首先,#include "matlab.hpp"是必不可少的,要不然编设器真不知道我是调用MatLab中的函数。其次,在MatLab的世界里,所有的数(组)都是矩阵,哪怕只是做一个简单的1+1=2,其实都是矩阵们之间的交易。c++数学库函数的调用方式和MatLab里的调用方式非常相似,当然进行交易的也都是一些矩阵,这里的mwArray类(注意,这是一类),就是一个矩阵,在C库里面就是mxArray结构体,mwArray类其实是有一个指向一个mxArray结构体的指针,关于这个就不多说了。其实关于这个看是很简单的函数,如果细细的去读它,会发现一些小问题(这里的问题不是说这个函数有错),这些问题是须要弄明白的。
5、要使这个dll知道它其有被“别人”调用的功能,就必须要声明哪些函数(当然这个例子中只有一个函数,但实际上,可能不只一个)是要导出的。关于这个有两种方式,我在这里采用的是一种通过性较好的方式——运用.def文件。所以,在这个工程中增加一个文体文件,并把它命名为“dll_1.def”,这里的.def护展名需要手动的键入。并在dll_1.def中输入以下的代码:
LIBRARY dll_1
EXPORTS
6、编译工程,生成dll。“组建”—>“组建[dll_1.dll]”。于是,会发现在工程所在的文件目录下就的bin/Debug文件夹中就生成了一个dll_1.dll文件了,这就是我们想要的东西了。
7、在C#中调用dll_1.dll中的函数(具体来说,是调用LU这个函数)。打开VS2008,新建一个C#窗口工程吧。啊,刚刚把vc6.0关掉,现在又打开VS2008,真是倍感亲切和畅快,因为在C#里面,好像一切都不那么拘束了,很随便。在C#里,没有单独的函数了,所有都是对像,函数就只能存在于对像之内了,像调入的C++DLL中的函数,一般都只能是对像的静态成员函数。于是,在工程中增加一个类,随便取个名字吧,叫cppDllInvokeDemo,具体的代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices; //注意加入这个命名空间
namespace CshapWinInvokeCppDll
{
class cppDllInvokeDemo
{
const string dll_1 = "dll_1.dll";
[DllImport(dll_1, CallingConvention = CallingConvention.Cdecl)]
public static extern int LU(int n, double[] A,double[] B,double[] X);
}
}
方法1 mcc 生成cpp文件方式
1、设置项目编译选项
首先建立一个新的项目,或者打开一个已有的项目,然后选择菜单:
Project-> Settings-> C/C++
Category:Preprocessor
Preprocessor definitions:
添加: MSVC,IBMPC,MSWIND
Category: Precompiled Headers
选择: Automatic use of precompiled headers
Through header: stdafx.h
2、调设置项目连接选项
首先要从下面几个函数定义文件(*.def)生成相应的导入库文件(*.lib)
libmmfile.def
libmcc.def
libmatlb.def
libmx.def
libmat.def
我不能告诉你详细方法,要说的是matlab有专门的COM组件跟c++结合,网上很难用文字说清楚。
我以前做过一个程序,是用C++生成了Matlab代码保存为文本,然后再用程序更改扩展名,调用MatLab打开,只能做到截取图片。。。
最近没空,所以简单的说一下。在C或者C++执行Matlab的函数需要调用Matlab引擎,Mathworks提供了详细的帮助,你在Matlab帮助文件里搜索engOpen函数,最下面有个例子,叫engwindemo.c,是教你如何在C中使用Matlab引擎。
要执行Matlab函数需要调用engEvalString函数,他可以把一个字符串放到Matlab里面去执行,如果这个字符串是个函数名称,且Matlab可以找得到这个函数的话就会执行他。
整个过程不是几分钟弄得明白的,因为你要用C和Matlab互操作必须要熟悉mxArray这个类型的使用,所有Matlab的数据都是以mxArray来保存的,因此你执行函数返回的内容也会是mxArray。
不过,Matlab帮助文件都很详细地说了使用方法。