日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

C++和MATLAB混合编程-DLL篇

發(fā)布時(shí)間:2025/3/21 c/c++ 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++和MATLAB混合编程-DLL篇 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

先小話一下DLL,DLL是動(dòng)態(tài)鏈接庫(kù),是源代碼編譯后的二進(jìn)制庫(kù)文件和程序接口,和靜態(tài)鏈接庫(kù)不同的是,程序在編譯時(shí)并不鏈接動(dòng)態(tài)鏈接庫(kù)的執(zhí)行體,而是在文件中保留一個(gè)調(diào)用標(biāo)記,在程序運(yùn)行時(shí)才將動(dòng)態(tài)鏈接庫(kù)文件加載入內(nèi)存。并且DLL在運(yùn)行時(shí)是共享的,即當(dāng)多個(gè)程序調(diào)用時(shí),內(nèi)存中也只保持一份動(dòng)態(tài)鏈接庫(kù)。

動(dòng)態(tài)鏈接庫(kù)的調(diào)用有顯式和隱式兩種方式。

隱式鏈接需要用到我們前面生成的plotdata.c,plotdata.h,plotdata.lib以及plotdata.dll文件。
首先將plotdata.c,plotdata.h加入工程中,注意在需要用到函數(shù)的文件加入#include “plotdata.h”。
之后鏈接輸入項(xiàng)中寫上plotdata.lib。右擊工程->Propertites->Link->Input->Additional Dependecies中加上plotdata.lib(也就是在調(diào)用MATLAB引擎時(shí)填寫libmat.lib、libeng.lib等的地方)注意plotdata.lib也需要放在你的工程下,或者寫全路徑,如"D:\data\plotadata.lib",需要加引號(hào)。
這樣在你的代碼中就可以直接用plotdata.h中的接口函數(shù)了。

另顯式鏈接的方式:所謂“顯式”說(shuō)白了就是在代碼中寫出來(lái)我要調(diào)用這個(gè)DLL。

首先我們需要定義一個(gè)函數(shù)類型,方便我們后面進(jìn)行函數(shù)的強(qiáng)制類型轉(zhuǎn)換。我們可以在plotdata.h中找到我們將要使用的函數(shù)plotdata,他的函數(shù)聲明如下:

[cpp]?view plaincopy
  • extern?LIB_plotdata_CPP_API?void?MW_CALL_CONV?plotdata(const?mwArray&?rgbData);??

  • 忽略那些復(fù)雜的宏定義,模仿著定義我們自己的函數(shù)類型:

    [cpp]?view plaincopy
  • typedef?void?(*HMAT)(const?mwArray&?rgbData);??

  • 之后在代碼中顯式鏈接plotdata.dll

    [cpp]?view plaincopy
  • HINSTANCE?hDLL=NULL;//DLL句柄??
  • hDLL=LoadLibrary("plotdata.dll");??
  • HMAT?plotData=(HMAT)GetProcAddress(hDLL,"plotdata");??
  • ????????????????//第一個(gè)參數(shù)為DLL句柄,第二個(gè)為要加載的函數(shù)名??
  • 之后便可直接在代碼中直接使用函數(shù)plotData了。這種顯式鏈接只需要plotdata.dll文件即可~
    下面我們來(lái)看一下生成的函數(shù)接口
    [cpp]?view plaincopy
  • extern?LIB_plotdata_C_API???
  • bool?MW_CALL_CONV?plotdataInitializeWithHandlers(??
  • ???????mclOutputHandlerFcn?error_handler,???
  • ???????mclOutputHandlerFcn?print_handler);??
  • ??
  • extern?LIB_plotdata_C_API???
  • bool?MW_CALL_CONV?plotdataInitialize(void);??
  • ??
  • extern?LIB_plotdata_C_API???
  • void?MW_CALL_CONV?plotdataTerminate(void);??
  • ??
  • extern?LIB_plotdata_C_API???
  • void?MW_CALL_CONV?plotdataPrintStackTrace(void);??
  • ??
  • extern?LIB_plotdata_C_API???
  • bool?MW_CALL_CONV?mlxPlotdata(int?nlhs,?mxArray?*plhs[],?int?nrhs,?mxArray?*prhs[]);??
  • ??
  • extern?LIB_plotdata_C_API???
  • long?MW_CALL_CONV?plotdataGetMcrID();??
  • ??
  • extern?LIB_plotdata_C_API?bool?MW_CALL_CONV?mlfPlotdata(mxArray*?rgbData);??
  • 這是plotdata.h中主要的函數(shù)。plotdataInitialize(void)可以看出是初始化的函數(shù)。如果是隱式鏈接DLL最好先調(diào)用此函數(shù),判斷返回值否則很可能加載不到dll,而在顯式鏈接時(shí),如果沒有加載函數(shù)成功,也不會(huì)直接報(bào)錯(cuò),但我們可以在單步調(diào)試時(shí)看函數(shù)是否為分配了內(nèi)存(即是否為null)。plotdataTerminate(void)是終止動(dòng)態(tài)鏈接庫(kù)的函數(shù)。
    mlxPlotdatat與mlfPlotdata是最關(guān)鍵的兩個(gè)接口,也是我們要加載的函數(shù)。他們執(zhí)行的功能與m文件中plotdata函數(shù)是一樣的。兩個(gè)函數(shù)輸入?yún)?shù)不同:
    mlxPlotdata(int nlhs, mxArray *plhs[], int nrhs, mxArray *prhs[]); 其中 nlhs,plhs分別表示輸出參數(shù)的個(gè)數(shù)及輸出參數(shù)的mxArray數(shù)組;nrhs,prhs表示輸入?yún)?shù)的個(gè)數(shù)及輸入?yún)?shù)數(shù)組。(這個(gè)函數(shù)有點(diǎn)通用的感覺……)
    mlfPlotdata(mxArray* rgbData); 就簡(jiǎn)單的多,基本和m文件中你定義的plotdata函數(shù)是一樣的(我的plotdata定義為 function []=plotdata(rgbData))
    所以一般在程序中加載的是mlf開頭的函數(shù)。
    這里需要提的是我編譯生成的是C的動(dòng)態(tài)鏈接庫(kù)。如果是生成C++的動(dòng)態(tài)鏈接庫(kù),生成的接口函數(shù)也帶有一個(gè)mlx開頭的函數(shù),即
    bool MW_CALL_CONV mlxPlotdata(int nlhs, mxArray *plhs[], int nrhs, mxArray *prhs[])
    但是另一個(gè)函數(shù)是不帶有mlf的,直接為
    void MW_CALL_CONV plotdata(const mwArray& rgbData)
    而且輸入?yún)?shù)不是mxArray數(shù)組,而是mwArray數(shù)組,這也是C和C++與MATLAB混合編程時(shí)最主要的不同(下篇再詳細(xì)說(shuō))
    但是我在嘗試C++動(dòng)態(tài)鏈接時(shí)一直沒有成功。后來(lái)看到生成的cpp文件同c文件一樣也有一個(gè) extend "C"{},這是C++為了與C兼容而提供的一個(gè)關(guān)鍵字,C++編譯器將會(huì)在extend "C"的大括號(hào)內(nèi)部代碼當(dāng)做C語(yǔ)言代碼處理,這讓我很困惑……而如果注釋掉又會(huì)報(bào)連接錯(cuò)誤
    想來(lái)可能是MATLAB對(duì)C++編譯支持并不好(他自帶的lcc編譯器是只能編譯成C的接口)總之沒有嘗試成功,暫時(shí)在程序中都用C的動(dòng)態(tài)鏈接了。


    (轉(zhuǎn)載請(qǐng)注明作者和出處:http://blog.csdn.net/xiaowei_cqu?未經(jīng)允許請(qǐng)勿用于商業(yè)用途)


    [cpp]?view plaincopy
  • <pre?code_snippet_id="1

  • 總結(jié)

    以上是生活随笔為你收集整理的C++和MATLAB混合编程-DLL篇的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。