2017-10-25 47 views
2

Matlab Compiler SDKを使用してLabViewから呼び出せるDLLをビルドします。 Matlab Compiler SDK( 'my_dll.dll'/'my_dll.lib'と呼ぶことができます)で生成されたライブラリは、非標準データ型(mxArrays)を使用しているため、LabViewで直接呼び出すことはできません。Matlab/LabViewインタフェース用のCコードでDLLラッパーを作成します

私の計画はCでラッパーコードを生成することです。このラッパーコードは、呼び出されるたびにMatlabランタイムエンジンの必要なルーチンを実行し、 'my_dll.dll'で生成された関数を呼び出します。このラッパーコードは、基本的に、先に生成されたDLLを使用する他の実行可能ファイルまたはアプリケーションと非常に似ていて、thisのガイドラインに従います。

コード例は:

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を生成しなければならない、と私はへの道を見つけることができませんので、ここでの問題は、来ますこれを行う。次の図は、私がしたいことをまとめたものです。私が試してみました

enter image description here

もの:

1 - MATLAB CompilerのSDK 'mbuildの' コマンドでwrapper.dllを生成するために、Cラッパーコードとmy_dll.libをコンパイルします。これは実行可能ファイルを作成するだけで、dllファイルは作成しません。たぶん私は何かを見逃しています。

2 - Visual Studioを使用してDLLを作成します。

機能「公共の場で参照エラーLNK2019未解決の外部シンボル_mclRunMain_proxy:静的ダブル__cdeclラッパー::関数のように私はここに直面しています問題は、私はそれは私にエラーの多くを与えるプロジェクトをビルドしようと思ったときにということです:: wrapper_sqrt(ダブル)」(?wrapper_sqrtの@関数@ラッパー@@ SANN @ Z)Win32Project1 ... \プロジェクト\ Visual Studioの2015 \ Win32Project1 \ Win32Project1 \ 1

wrapper.objたぶん私のエラーはこちら私はMatlabライブラリを適切にリンクしていないと思います。その場合、私はそれを修正する方法がわかりません。

LabViewでMatlabコードを実行する他の方法は、MathScriptノード、Matlab ScriptノードまたはMatlab Coder(DLLを作成するために)を使用することですが、いくつかの理由でそれらのオプションを破棄します。

ご協力いただきありがとうございます。

答えて

0

試行#2では、プロジェクトのmatlab dllへの参照を追加しましたか?

関連する問題