Matlab 版 (精华区)
发信人: Ustcer (山城棒棒儿军), 信区: Matlab
标 题: How do I create a shared library in MATLAB?
发信站: 哈工大紫丁香 (2004年04月11日22:44:54 星期天), 站内信件
欢迎热爱matlab的朋友们光临 交流
http://genial.yculblog.com/post-13289.html
从mathworks的网站上面看到一篇tech-note,照着写了一下,可以通过,但是还有诸多
其他问题。
example:
1. 编写一个简单的M 文件 function,保存为 foo.m,此function如下:
function y=foo(x)
y = x+1;
2. 利用MATLAB 编译器将foo.m编译成 c代码,以及 C 共享库文件:
>> mcc -t -L C -W lib:foolib -T link:lib foo.m libmmfile.mlib
说明:
-t 告诉MATLAB编译器将M代码翻译成目标代码;
-L 指明需要采用的目标语言,这里可以选择 C, CPP等;
-W 告诉matlab编译器采用lib:后面指定的名字建立库文件包;
-T 告诉编译器采用的平台与目的,在这里我们想生成可以我 们的应用程序中
共享的库文件(也就是说,PC机器上的DLL);
指定的libmmfile.mlib告诉matlab编译器将Matlab的数学库预编译到共享库中(
如果需要的话)
-g 使得产生的DLL可以在MSVC(或者你的IDE)中编译
通过这一步,可以产生如下的文件:
foo.c
foo.h
foolib.c
foolib.h
foolib.exports
foolib.dll
foolib.exp
foolib.lib
foolib.mlib
3. 打开VC 6.0 IDE, 新建一个 Win32 Console Application 类型的工程:Test ,P
latforms选择 Win32,定位好自己的文件位置。单击OK
在第二步中选择 空的工程,单击Finish;
4. vc的一些设置:(这里我采用的跟mathworks的technote介绍的略有不同)
(1),在项目建立后,设置环境。
Tool->options->Diretories 页面下Show directories for
先选择Include Files,输入路径:D:\PROGRAMS\MATLAB6P5P1\EXTERN\INCLUDE
在选择Library Files,输入路径:D:\PROGRAMS\MATLAB6P5P1\EXTERN\LIB\WIN32\MICROSO
FT\MSVC60
(我的matlab根目录是 D:\PROGRAMS\MATLAB6P5P1\ ;这里的设置对不同工程只需要一次)
(2)打开Project->Settings->Link页面,在Object/Library modules
中加入libmatlb.lib libmmfile.lib libmx.lib 。(这里对每个工程都要设置,并且根据
需要选不同的库)
5. 将刚才生成的foolib.h,foolib.lib, foolib.dll,foolib.mlib拷贝到工程目录
下;(不完全清楚是否需要foolib.mlib,我这里不要也行)
6. 打开Project---->Add to project---->Files... ,将刚刚拷贝过来的foolib.lib
加入到工程中;
7. 选中vc的workspace的 File View标签,双击 test files展开,选择
Project------>Add to project ------>New... ,为工程增加一个名为 foowrap.c的 c+
+Source 文件;
8. 在foowrap.c中加入下面的代码:
#include "foolib.h"
#include "matlab.h"
#include <stdio.h>
void main(void)
{
mxArray *x_ptr;
mxArray *y_ptr;
double *y;
double ret;
x_ptr=mxCreateDoubleScalar(4);
foolibInitialize(); // 初始化
y_ptr=mlfFoo(x_ptr);
foolibTerminate(); //终止
y=mxGetPr(y_ptr);
ret=*y;
printf("The output of foo is %f\n",ret);
mxDestroyArray(x_ptr); // 释放 mxArray
mxDestroyArray(y_ptr);
}
9. Ok, 编译,运行,可以了吧? 看到dos窗口输出的:
The output of foo is 5.000000 了吧?是不是很兴奋啊?
不过,这个程序是不是太死板了点儿?
我也这样想的,然后我就想通过输出给出输出,可是不知道为什么,我先用
scanf从外界获取输入后,想通过memcpy将获取的值赋值给x_ptr,却怎么也不成功~
sigh,下次再试试了~
有没有谁知道的指点指点呀?
--
http://www.cheunghoyee.com/bbs/uploadFace/242_200341416215150326.gif
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 210.45.76.192]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.865毫秒