Visual Studio 2013+MatlabR2016b(汉化版)+Win7 64位+Debug x64 混编DLL 成功 (转)

转载 + 错误修复更新(还是出现了不一样的错误,自己找出并已解决,在本文最下面)


转载地址: https://blog.csdn.net/qq_29567701/article/details/78286884


参考 原博客:Matlab 2016a和VS2013混合Dll编程步骤

1. 与原博客的不同之处:

main.cpp中做一点小修改:

// main.cpp : 定义控制台应用程序的入口点。  
#include "stdafx.h"
#include <iostream>  
#include "mclmcr.h"  
#include "matrix.h"  
#include "mclcppclass.h"  
#include "Detector.h"  
using namespace std;
#pragma comment(lib,"Detector.lib")  

int _tmain(int argc, _TCHAR* argv[])
{

    if (!DetectorInitialize())   
     //初始化  //注意这个初始化中 !DetectorInitialize() 字段中的 Detector与matlab编译成的.lib同名
    {
        cout << "Could not initialize addfunction!";
        exit(0);
    }

    mwArray result(1, 1, mxDOUBLE_CLASS, mxREAL);
    mwArray a(1, 1, mxDOUBLE_CLASS, mxREAL);
    mwArray b(1, 1, mxDOUBLE_CLASS, mxREAL);
    double data1; double data2;

    cout << "\n*********************************************\n";
    cout << "***** 该程序功能:实现任意两个实数的和。*****\n";
    cout << "*********************************************\n\n";
    cout << "请输入任意两个实数a,b:";
    cin >> data1 >> data2;
    a.SetData(&data1, 1);
    b.SetData(&data2, 1);
    result.SetData(&data2, 1);

    Detector(1, result, a, b);  //调用自己用matlab写的函数 
    //.m文件中为:function y=Detector(x,z);
    //.h文件中为:extern LIB_Detector_CPP_API void MW_CALL_CONV Detector(int nargout, mwArray& y, const mwArray& x, const mwArray& z);   

    double x = a.Get(1, 1);
    double y = b.Get(1, 1);
    double z = result.Get(1, 1);
    cout << "a+b= " << z << endl << endl;

    DetectorTerminate(); 
     //注意结束中 !DetectorInitialize() 字段中的 Detector也与matlab编译成的.lib同名
    return 0;
}
  • 在这里提供一下 我的步骤图(有一样的可以参考一下):

2.我的步骤

2.1在matlab中建立一个Detector.m文件,实现加法功能

%实现加法功能
function y=Detector(x,z)
y=x+z;

2.2. 从Matlab导出.m文件为Dll文件

Step1:将Matlab工作路径转为目标.m文件所在文件夹,在控制栏输入“mex –setup”,弹出如下说明: 
 
Step2:点击“mex –setup C++”,弹出如下说明,看到“MEX 配置为使用 ‘Microsoft Visual C++ 2013 Professional’ 以进行 C++ 语言编译。”,说明配置好用C++语言进行编译; 
 
Step3:继续输入“deploytool”,弹出compile窗口,选择第三个,即Library Compiler; 
 
Step4:三步配置Library Compiler 
(1)在弹出窗口中,左上角选择“C++ Shared Library”, 
(2)右侧添加需要转换的.m文件,下面第一行输入转换后的Dll文件名, 
(3)最后点击右上角“Package”对号;然后,生成二进制文件 
 
Step5:生成后文件夹如下图所示,第一个文件夹中的exe文件用于程序发布时用,第二个文件夹中包含相当于release下得.h,.lib和 .dll文件,第三个文件包含测试用地.h,.lib和 .dll文件等文件,是测试需要的;(第二个文件和第三个文件中的.h,.lib和 .dll文件完全相同。) 
 
Step6:新建一个Win32控制台应用程序工程,命名为Test;Source Files中添加 main.cpp文件,将本博客刚开始写的 main.cpp代码写入其中。保存。 
 
然后将for_redistribution_files_only(Step5)文件中的 .h,.lib和 .dll文件拷到新建应用程序下和.cpp文件放在一起,如下图 

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

Step0:在系统环境变量的Path中添加“Matlab安装目录\bin\win64;” 
(这里对原博客进行了补充) 
计算机->属性->高级系统设置->环境变量->系统变量->Path: 
添加“;Matlab安装目录\bin\win64”(Matlab安装目录 指你自己的matlab安装目录) 
 
 
 
Step1:在项目属性中的包含目录添加“Matlab安装目录\extern\include;” 
Step2:在项目属性中的库目录添加“Matlab安装目录\extern\include\win64\microsoft;”(与原博客不同,没有bin文件) 

Step3:在项目属性链接器输入中添加以下库名: 
libmat.lib 
libmex.lib 
mclmcr.lib 
mclmcrrt.lib 
libemlrt.lib 
libeng.lib 
libfixedpoint.lib 
libcovrt.lib 

将库名粘贴到这里:然后点击OK. 
 
Step5:为项目添加matlab生成的Detector.h头文件( 2.2.中Step6中的.h文件 第二张图片 )。 
Test Project配置好的的Solution Explorer 的目录如下图所示: 

至此,配置结束。 
点击,Ctrl+F5 ->Yes即可出现结果。^_^ 

这里写图片描述

对于我这样的小白来说,上述步骤还是出现了其他的问题,比如:

扫描二维码关注公众号,回复: 2148091 查看本文章


1——TCHAR*标红并出错,只需要在开头加上—— #include "TCHAR.h" 即可


2——无法打开detector.h

解决方法是在test工程属性中--包含目录&库目录--添加 test工程里的(你刚才复制进去的)detector.h的路径,两个都要添加(对于小白来讲)


3——接下来肯定还没有结束,调试还会出现“错误 1 error LNK2019: 无法解析的外部符号 _ref_count_obj_addref_proxy,该符号。。。。”等不下10多个这样的问题,这是因为你的debug的问题,记住我们的标题是x64,你要在本地调试器旁边的debug下拉出配置管理器,自己选择或者新建出x64的平台;


4——最后看起来要成功了,发现还是不行,程序无法运行,因为detector.dll找不到无法加载,这个只需要把你test目录下的detector.dll拷贝到C:\Windows\System32目录下就好了,再运行,稍作等待,加载dll文件,OK,成功,可以输入两个数字试一试了。


总之,关键的三个文件detector.h      detector.lib    detector.dll个个是坑,一定要把这些头文件、库、动态链接安置好,才可以混编调用。


转载如有侵犯请联系我删除,感谢前人的努力。


猜你喜欢

转载自blog.csdn.net/skywalker_123/article/details/79919347