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毫秒