我在matlab中写好了一个RCWA函数,然后将此函数封装编译在vs中调用,调用后计算的结果与matlab中计算的相同,但是之后我使用VS创建DLL工程,在此工程下我继续调用了之前的matlab函数,编译后是成功的,之后把编译完成后的DLL文件放至zemax的DLL文件夹中,打开zemax却显示此DLL无法加载,是不是vs编译的DLL中给zemax调用时,内部不能有matlab的函数。
dll是非常严格规范的,编译链接通过后,出问题应该和引入的静态库没有关系了。dll无法加载需要检查冲突,另外,要确认编译参数是release。
以在Matlab中通过mcc命令生成一个动态链接库(DLL)文件。在Matlab命令窗口中输入如下命令:
mcc -W cpplib:MyLib -T link:lib MyFunc.m
其中,-W cpplib:MyLib将生成一个名为MyLib的CPPLib文件,-T link:lib指定生成的动态链接库类型为lib。
生成完DLL文件后,我们可以在VC中建立一个简单的工程,用于调用Matlab程序。首先,需要在VC工程中添加Matlab动态链接库文件。将生成的MyLib.lib、MyLib.dll、MyLib.h文件添加到工程中。
接下来,在我们的VC代码中,我们需要调用Matlab动态链接库,可以使用下面的代码:
void main() { // 初始化Matlab运行时环境 if (!mclInitializeApplication(NULL, 0)) { printf("无法初始化Matlab MCR。\n"); return; } // 调用Matlab函数 mxArray input, output; double a = 3; input = mxCreateDoubleMatrix(1, 1, mxREAL); ((double )mxGetData(input)) = a; mlfMyFunc(1, &output, input); double b = ((double )mxGetData(output)); printf("%f\n", b); // 释放内存空间 mxDestroyArray(input); mxDestroyArray(output); // 关闭Matlab运行时环境 mclTerminateApplication(); }
在代码中,我们首先需要调用mclInitializeApplication函数初始化Matlab运行时环境。然后,我们可以通过mxCreateDoubleMatrix函数创建一个包含参数的数组,调用mlfMyFunc函数调用Matlab程序,最后通过mxGetData函数获取Matlab程序的返回值。最后,调用mxDestroyArray释放内存空间,调用mclTerminateApplication关闭Matlab运行时环境。
至此,我们就可以在VC中成功调用Matlab程序了。当然,如果你需要将生成的DLL文件直接放入Zemax的DLL文件夹中使用,需要确保Zemax的运行时环境与Matlab的运行时环境相同。如果有不同版本的运行时环境,可能会出现类似上述问题的错误。