亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

c++調用matlab導出的dll及顯式隱式調用

標簽:
C++

公司引入了第三方公司的算法,而第三方公司只提供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

webp

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(); // 终止
    }
}


常见问题

1. dll找不到

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

2. Initialize初始化报错

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



作者:ThinkinLiu
链接:https://www.jianshu.com/p/b4a2ce409aab


點擊查看更多內容
1人點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消