Matlab和Visual C++的混合编程(4)
时间:2025-02-24
时间:2025-02-24
Matlab和Visual C++的混合编程
Matlab运行环境的独立的运用程序,在编译的过程中,如果调用Matlab工具箱中的函数,Matlab会自动联编所需要用到的其它m文件,并生成相应的C或者C++源代码。
此种方法的步骤比较繁琐,对Matlab编译器的命令参数和Visual C++的设置都需要详细的了解,作者将此种方法混合编程的过程介绍如下:
1) 用Matlab编译器编译m文件,根据m文件是否使用了图形相关的函数,命令参数分别如下:
没有使用图形相关函数:mcc–t –L C m文件、或者mcc –t –L CPP m文件分别得到C源代码和C++源代码。
使用了图形相关函数:mcc –B sgl –t –L C m文件、或者mcc –p –B sglcpp m文件分别得到C源代码和C++源代码。
2) Visual C++设置:在Tools/Options/Directories的Include Files中加入: MATLAB路径\EXTERN\INCLUDE\CPP
MATLAB路径\EXTERN\INCLUDE
Library Files中加入:
MATLAB路径\EXTERN\LIB\WIN32
MATLAB路径\EXTERN\LIB\WIN32\MICROSOFT\MSVC60
在Project/Setting/link的Input中,Object/Library modules文本框中加入libmmfile.lib libmatlb.lib libmx.lib libmat.lib libmatpm.lib sgl.lib libmwsglm.lib libmwservices.lib,这些lib是Visual C++运行Matlab编译的C/C++源代码所需要的库,在Ignore Libraries中有时候要加入msvcrt.lib,libcd.lib,这主要是看Matlab的库函数是否与Visual C++提高的函数产生冲突而定,在Win32 Application的Visual C++工程中一般需要在Ignore Libraries中加入msvcrt.lib,libcd.lib以解决警告信息。
在Project/Setting/C/C++中,Preprocessor definitions中加入MSVC,IBMPC,MSWIND;再在下拉框中选择Precomplied Headers,选中Automatic use of precompiled headers,在其中填入stdafx.h。
3) 添加Matlab编译后与m文件对应的.h或.hpp、.c或.cpp和bin目录(用到图形相关函数才有)复制到所建的工程中。
修改源代码,以MFC Appwizard(exe)工程为例:首先要添加相应的头文件,其次在InitInstance函数中加入:
libmmfileInitialize();
libmwsglmInitialize();
mlfHGInitialize(NULL,NULL);
在析构函数中加入:
mlfHGTerminate();
libmmfileTerminate();
libmwsglmTerminate();
然后在适当的位置添加需要Matlab类型代码或者调用的Matlab编译后的功能函数。
4) 编译调试,由于此方法设置比较复杂和灵活性比较大,所以调试必不可少的,要根据不同的错误提示做不同的改动。
2.5 调用外部程序
这种方法是先利用Mideva或者Matlab自身编译器直接生成EXE文件,然后在Visual C++的工程中通过CreateProcess()或Shell调用,常见的外部函数有shellexec()或winexec()。这种方法简单方便,但运行时出现一个控制台窗口,而且由于Visual C++和Matlab之间不能交互,通用性差,仅适用于Visual C++工程中调用Matlab实现图形显示的场合。
三、Visual C++和Matlab混合编程的问题总结
Matlab的运算功能强大、工具箱函数丰富,本设计只是对Matlab和Visual C++的集成作了一些简单的试验,应用于图像处理方面,并作了一些对比;但是目前两个开发工具的集成只能是比较简单、比较浅层的集成,要想进一步集成,Matlab或者Windows的内部调用机制要进一步完善,我们也要更进一步了解它们的内部机制。