美文网首页开发者日记C语言程序员
c++调用matlab导出的dll及显式隐式调用

c++调用matlab导出的dll及显式隐式调用

作者: IT老五 | 来源:发表于2018-12-05 16:53 被阅读5次

    公司引入了第三方公司的算法,而第三方公司只提供matlab导出的dll,java是无法调用的,于是不得不考虑再用c++封装一层dll供java调用。
    本人c++只是业余级,matlab更是路人,但公司在这方面也没什么人会,我只好继续硬着头皮开始探索之路。

    环境配置

    创建vc++项目后:

    1. 右键项目 - 属性 - VC++目录 - 包含目录,添加..\MATLAB\MATLAB Runtime\v90\extern\include
    2. 库目录添加:..\MATLAB\MATLAB Runtime\v90\extern\lib\win64\microsoft
    3. 链接器 - 输入 - 附加依赖项,添加以下几个lib:

    mclmcr.lib
    mclmcrrt.lib
    libmx.lib
    libmex.lib
    libmat.lib
    libeng.lib

    c++调用matlib的dll.jpg

    DLL调用

    调用matlab的dll大概分为三个过程,1. 初始化Initialize 2. 调用功能函数 3. 终止Terminate

    显式调用

    在c++中,dll的调用分为显式和隐式,显示调用的好处是只需要知道dll和里面的函数即可完成调用,不需要.h文件和.lib文件,以下是显示调用的实例

    #include<iostream>
    #include "windows.h"
    void test() {
        // 加载dll
        HINSTANCE testDLL = LoadLibraryA("TestDLL.dll"); // 包含一个Add函数
    
                                                         //TestDLL初始化函数
        typedef bool(*pInitialize)(void);//初始化函数
        pInitialize Initialize = NULL;
        Initialize = (pInitialize)GetProcAddress(testDLL, "TestInitialize");//TestInitialize函数声明在.h文件里面
    
        if (Initialize()) //初始化,成功后才进入后续调用
        {
            //TestDLL功能函数
            typedef int(*pAdd)(int num1, int num2);
            pAdd Add = NULL;
            Add = (pAdd)GetProcAddress(testDLL, "Add");//Add函数声明在.h文件里面
    
            int sum = Add(1, 1);
            std::cout << " Add(1, 1) = " + sum << std::endl;
    
    
            //TestDLL结束函数
            typedef void(*pTerminate)(void);
            pTerminate Terminate = NULL;
            Terminate = (pTerminate)GetProcAddress(testDLL, "TestTerminate");//TestTerminate函数声明在.h文件里面
    
            Terminate();
    
        }
        // 释放dll
        FreeLibrary(testDLL);
    }
    
    隐式调用

    隐式调用则需要.h文件和.lib文件,将头文件导入项目中,然后使用以下代码实现,还是相同的三个方法,隐式调用需要处理头文件,比显示调用麻烦,但是代码上比显示看上去简洁(也许是因为我的demo比较简单)

    #include<iostream>
    #include "TestDLL.h" // 一般会在test.h中include该头文件,然后只需导入test.h即可
    #pragma comment(lib, "TestDLL")
    void test() {
        if (TestInitialize()) //初始化,成功后才进入后续调用
        {
            int sum = Add(1, 1); // 功能函数
            std::cout << " Add(1, 1) = " + sum << std::endl;
    
            TestTerminate(); // 终止
        }
    }
    

    原文:简书ThinkinLiu 博客: IT老五

    常见问题

    1. dll找不到

    如果是相对目录,是相对于你所见的项目目录而言的,放在在项目目录下即可

    2. Initialize初始化报错

    这个一般是matlab环境问题或者是加载不到dll导致的

    相关文章

      网友评论

        本文标题:c++调用matlab导出的dll及显式隐式调用

        本文链接:https://www.haomeiwen.com/subject/wlrwcqtx.html