我想用Matlab Compiler SDK构建一个可以从LabView调用的DLL。您可能知道,Matlab编译器SDK生成的库(我们称之为“my_dll.dll' /#39; my_dll.lib'”)不能由LabView直接调用,因为它使用非标准数据类型(mxArrays)。
因此,我的计划是在C中生成一个包装器代码。无论何时调用此包装器代码,它都将执行Matlab运行时引擎所需的例程,并调用在' my_dll.dll'中生成的函数。根据{{3}}的指导原则,此包装代码与使用以前生成的DLL的任何其他可执行文件或应用程序基本上非常相似。
代码示例:
int main(double *input){
/* Call the mclInitializeApplication routine. Make sure that the application
* was initialized properly by checking the return status. This initialization
* has to be done before calling any MATLAB API's or MATLAB Compiler SDK generated
* shared library functions. */
mclmcrInitialize();
if( !mclInitializeApplication(NULL,0) )
{
fprintf(stderr, "Could not initialize the application.\n");
return -1;
}
return mclRunMain((mclMainFcnType)wrapper_main,0,NULL);
}
double wrapper_main(int argc, char **argv) {
//declare variables
double *out; // Here my output will be stored
double number = 16; // This is the input number
// Initialise library
dll_layer1Initialize();
//Create two pointers of mxArray type to store inputs and outputs
mxArray *in1_ptr;
mxArray *out1_ptr = NULL;
//Allocate input pointer to a 1 by 1 double, real matrix
in1_ptr = mxCreateDoubleMatrix(1, 1, mxREAL);
//Move the data from the input to the pointer
memcpy(mxGetPr(in1_ptr), &number, 1 * sizeof(double));
//Pass values to mlfFoo and receive in mxArray type variable
//mlfFoo is my matlab function. In this case it only performs
//the square root of the input number.
mlfFoo(1, &out1_ptr, in1_ptr);
out = mxGetPr(out1_ptr);
printf("\n Result is: %f", *out);
//Terminate foo implementation
dll_layer1Terminate();
mclTerminateApplication();
return 0;
}
但是,为了从LabView调用这个C包装器代码,我必须生成一个新的DLL,这就出现了问题,因为我找不到这样做的方法。以下图片总结了我想要做的事情。
我尝试过的事情:
1 - 编译C包装器代码和my_dll.lib以使用Matlab编译器SDK生成包装器' mbuild'命令。这只会创建一个可执行文件,但不会创建一个dll。也许我错过了什么。
2 - 使用Visual Studio创建DLL。我在这里遇到的问题是,当我要构建项目时,它会给我很多错误,例如:
错误LNK2019未解析的外部符号_mclRunMain_proxy在函数&#34中引用; public:static double __cdecl Wrapper :: Functions :: wrapper_sqrt(double)" (?wrapper_sqrt @ Functions @ Wrapper @@ SANN @ Z)Win32Project1 ... \ visual studio 2015 \ Projects \ Win32Project1 \ Win32Project1 \ wrapper.obj 1
也许我的错误在于我没有正确链接Matlab库,在这种情况下我不知道如何解决它。
在LabView中运行Matlab代码的其他可能性是使用MathScript节点,Matlab脚本节点或Matlab编码器(用于创建DLL)但是,由于其他几个原因,我放弃了这些选项。
先感谢您的帮助。
答案 0 :(得分:0)
对于尝试#2,您是否在项目中添加了对matlab dll的引用?