在C代码中为Matlab / LabView接口创建DLL包装器

时间:2017-10-25 08:58:58

标签: c++ c matlab dll labview

我想用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,这就出现了问题,因为我找不到这样做的方法。以下图片总结了我想要做的事情。

this

我尝试过的事情:

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)但是,由于其他几个原因,我放弃了这些选项。

先感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

对于尝试#2,您是否在项目中添加了对matlab dll的引用?