C++程序打包.dll文件并调用

在学习将C++打包成dll文件并调用的时候我参考了:
具体流程可以参考以上博客的流程。

但是在调用的时候出现了不能打开.dll文件的错误。

最后找到原因是:在设置连接器的输入时,如果仅仅是把我的.lib文件添加进去可能找不到该lib文件,在加上文件的绝对路径之后就可以了。
在调用.dll文件的时候     ①包含其头文件 即可

C++程序打包.dll文件C#调用

参考博客:


                                       lib和dll文件的区别和联系


参考博客:



                           Matlab 2016a和VS2013混合Dll编程步骤


转载:

1. 从Matlab导出.m文件为Dll文件;

Step1:将Matlab工作路径转为目标.m文件所在文件夹,在控制栏输入“mex –setup”,弹出如下说明:


Step2:点击“mex –setup C++”,弹出如下说明,看到“MEX configured to use ‘Microsoft Visual C++2013 Professional’ for C++ language compilation”,说明配置好用C++语言进行编译;


  Step3:继续输入“deploytool”,弹出compile窗口,选择第三个,即Library Compiler;


  Step4:在弹出窗口中,左上角选择“C++ Shared Library”,右侧添加需要转换的.m文件,下面第一行输入转换后的Dll文件名,最后点击右上角“Package”对号,如果.m文件中包含其他.m文件中的函数,不用一起添加,Matlab会自动检测,然后在窗口下面框中显示出依赖文件;

 


  Step5:生成后文件夹如下图所示,第一个文件夹中的exe文件用于程序发布时用,第二个文件夹中包含相当于release下得.h,.lib和 .dll文件,第三个文件包含测试用地.h,.lib和 .dll文件等文件,是测试需要的;


Step6:新建一个Win32控制台应用程序工程,自己命名,比如然后将for_testing文件中的 .h,.lib和 .dll文件拷到新建应用程序下和.cpp文件放在一起,如下图


2. 配置电脑系统环境变量和VS工程属性;

 Step1:在系统环境变量的Path中添加“Matlab安装目录\bin\win64;”

Step2:在项目属性中的包含目录添加“Matlab安装目录\extern\include;”

Step3:在项目属性中的库目录添加“Matlab安装目录\extern\include\lib\win64\microsoft;”

 

Step4:在项目属性链接器输入中添加以下库名

libmat.lib

libmex.lib

mclmcr.lib

mclmcrrt.lib

libemlrt.lib

libeng.lib

libfixedpoint.lib

libcovrt.lib

Step5:为项目添加matlab生成的头文件(上面Step6中和cpp文件放一起的那个.h文件)。

3. 编写测试程序:

[cpp]  view plain  copy
  1. // cpp5.cpp : 定义控制台应用程序的入口点。  
  2. #include "stdafx.h"  
  3. #include <stdio.h>  
  4. #include <iostream>  
  5. #include "mclmcr.h"  
  6. #include "matrix.h"  
  7. #include "mclcppclass.h"  
  8. #include "Mylib.h"  
  9. using namespacestd;  
  10. #pragma comment(lib,"Mylib.lib")  
  11.    
  12. int _tmain(int argc,_TCHAR* argv[])  
  13. {  
  14.    
  15.     if(!MylibInitialize())    //初始化  
  16.     {  
  17.         printf("Could not initialize addfunction!");  
  18.         exit(0);  
  19.     }  
  20.     printf("OK!");  
  21.     mwArray result(1, 1, mxDOUBLE_CLASS, mxREAL);  
  22.     mwArray a(1, 1, mxDOUBLE_CLASS,mxREAL);  
  23.     mwArray b(1, 1, mxDOUBLE_CLASS,mxREAL);  
  24.     doubledata1 = 2; double data2 = 3;  
  25.     a.SetData(&data1,1);  
  26.     b.SetData(&data2,1);  
  27.     result.SetData(&data2,1);  
  28.    
  29.     f(1,result, a, b);  //调用自己用matlab写的函数  
  30.     x= a.Get(1, 1);  
  31.     y= b.Get(1, 1);  
  32.     z= result.Get(1, 1);  
  33.     printf("%lf\n", x);  
  34.     printf("%lf\n", y);  
  35.     printf("%lf\n", z);  
  36.     MylibTerminate();  
  37.     return0;  
  38. }  


4.mwArray类常用方法的调用和问题;

   a. 将数组数据输入到mwArray变量中:

result.SetData(array,len);

     其中array是数组名,len是数组长度,如果是标量,如上面代码中所示;

   b. 获取mwArray中数据:

y =b.Get(arg1, arg2,…);

arg1是索引数目,后面输入参量是索引;

5. 常见问题汇总:

1. 系统变量一定不能多设,例如Matlab runtime路径设置一个就可以;Matlab安装目录下的bin\Win64路径只需着一个就可以,像…\lib和…\bin等母路径不必多加,多加反而画蛇添足,导致程序运行出现一系列莫名其妙的问题。还有链接器中输入项添加的.lib文件只需添加用到的库,没有用到的不要加,常用的就是libmx.lib,libmat.lib,mclmcrrt.lib,mclmcr.lib。

2. 上面添加include路径和lib路径是在VC++目录下,而不是在C/C++目录下,否则会出现程序崩溃问题;

3. 如果提示缺失”mclmcr.lib”,是因为没有配置系统环境变量;

4. 如果mwDLLInitialize初始化错误,程序编译无错误但运行出错,检查时候是系统环境变量添加冗余;

5. Matlab同样可以导出.Net架构下得Dll文件,以供C#语言调用,该过程比转为C++能用的Dll要简单,工程配置少,问题少。