由于項(xiàng)目需要避消,需要調(diào)用現(xiàn)有的matlab程序很泊,考慮將matlab程序生成動(dòng)態(tài)鏈接庫,再在Qt下動(dòng)態(tài)調(diào)用沾谓。在這個(gè)過程中委造,遇到了許多問題,寫個(gè)文章mark一下均驶。
1.環(huán)境準(zhǔn)備
我的電腦是win10昏兆,也先裝了VS2015,64位的matalb 2018 妇穴。我之前一直是用的Qt的mingw版本爬虱,32位。但是在Qt下調(diào)用matlab程序腾它,需要兩者版本一致跑筝,都為64位(32位)÷鞯危苦逼的是曲梗,Qt官方并未提供mingw的64位版本,網(wǎng)上有一些網(wǎng)友編譯好的版本妓忍,也可以自行編譯虏两。
參考網(wǎng)址:https://blog.csdn.net/an505479313/article/details/55105397
我嘗試過按上述方法編譯官方提供的源碼,編譯完仍出錯(cuò)世剖。我后來下載了QT的msvc? 64位的版本定罢。接下來簡單介紹Qt5.6.3 + VS2015 的環(huán)境搭建過程。
參考1:https://blog.csdn.net/an505479313/article/details/55105397
在Qt中路徑中有空格時(shí)會(huì)被認(rèn)為換行旁瘫,使用$$quote()
參考2:《Qt Creator快速入門》
參考3:VS2015+Qt
參照上述鏈接配置好環(huán)境后就能在Qt creator切換MinGw32位祖凫,MSVC2015 64位了琼蚯!
2.QT與Matalb混合編程
參考1:https://blog.csdn.net/qq_33221028/article/details/78398408
參考2:https://blog.csdn.net/HongAndYi/article/details/79477031
3.注意:
1.win10 sdk版本選擇:我在裝完調(diào)試器,搭建好環(huán)境后惠况,運(yùn)行程序遭庶,出錯(cuò):無法鏈接到rc.exe。原因是我裝的sdk版本與vS2015不匹配售滤,只支持2017罚拟。支持的VS2015有win 10 的14393版本。卸掉完箩,重裝win10 sdk赐俗。重裝完之后,又出現(xiàn)了找不到setdff.h文件的問題弊知,我在C:\Program Files (x86)\Windows Kits\10\Include下找到了該文件阻逮,于是在環(huán)境變量加入該路徑,重啟一下電腦秩彤,問題解決叔扼。
2.用
extern “C”
{#include"mydll.h";
}
出錯(cuò):error: C2894: 模板不能聲明為有“C”鏈接
將extern ”C“去掉
3.Qt本身的bug:出現(xiàn)一大堆錯(cuò)誤:
link2019:無法找到xxx.obj
解決:把bulid-xxx-Debug目錄直接手動(dòng)刪除,重新構(gòu)建漫雷,問題解決瓜富。
4.用mwArray拋出異常,在用mwArray注意要先初始化降盹。
用記事本打開用matlab生成的導(dǎo)出的頭文件xxx.h与柑,可以看到有這個(gè)函數(shù)
參考1:https://blog.csdn.net/HongAndYi/article/details/79477031
最后貼上我的完整代碼:
matlab下:
導(dǎo)出m'y'Fundll.h? myFundll.lib? myFundll.dll
從myFundll.h中可以看到導(dǎo)出的函數(shù) myFun(int nargout, mwArray& b, const mwArray& a);