VS/Qt C++和Matlab混合編程

      最近兩天在搞C++和Matlab混合編程,這個中間過程真是讓人心酸啊,最後仍是搞定成功!如今把這個過程記錄一下。python

      首先本身的電腦原本就安裝着matlab2013b,按着網上的說法首先須要輸入!mcc,測試當前matlab上的編譯器。但是發現沒有,上網查資料說是matlab2013b破解不徹底。沒辦法從網上下載了matlab2015a,而後安裝破解。測試發現編譯器OK編程

      而後寫了一個add.m文件,生成動態庫dll。而後在vs2013中調用,出現沒法解析的外部符號。而後用工具查看了一下dll中導出的符號。只有本身定義的那個函數符號符合正常的規則,其餘的函數導出符號看起來很奇怪,和函數自己名同樣。最後繼續在網上查找函數

     各類方法,後來講是軟件位數不一樣致使的。VS2013默認的版本是win32 32位的。而matlab導出的dll,是64位的,因此修改工程爲64位工程。另外就是配置各類matla須要的頭文件路徑和lib路徑。而後順利編譯經過。運行程序時讓人崩潰了 出現應用程序沒法啓動              0x000007b,而後查找網上各類說法,程序調用的dll不對,要修復系統dll,而後本身還下載了修改工具,把系統修復了一遍,可是仍是沒有解決問題。搞了一天半,人都快崩潰了 問題仍是沒有解決。無奈猜測是否是系統有什麼問題,而後把運行程序複製到win10系統下運行通過一番copy 須要的dll以後  點擊exe  仍是報一樣的錯誤。無奈啊。。。。工具

     算了  不搞了  又去求助python,查閱了一些python和matlab的對比介紹。仍是以爲matlab更符合本身的須要。沒辦法 還得搞這個問題。最後算了  先搞其餘事,先讓本身緩一緩。測試

    過了一天,本身內心仍是老惦記着這個事。心想是否是仍是matlab的問題,因而乎又去網上看別人成功的例子用的是哪一個版本。而後看到有人用matlab2016a和vs2013的案例。而後又去網上找matlab2016a的安裝包。而後一樣的方法安裝,破解,導出dll,vs調用 編譯。。最後運行。 內心那個苦啊   仍是報那個錯誤。上天呀  問題出在哪呢!!!!!!!!編譯器

    最後準備放棄的時候,忽然腦子閃過以前看過說matlab和C++混合編程頭文件重複包含致使重定義。的確工程編譯的有一些宏重複定義的警告。後來把包含的三個頭文件去掉,發現照樣能夠編譯過,包含多餘的。而後去點擊exe,居然運行成功了!成功了!居然一個小小的告警隱藏着這麼大的隱患。it

    具體根本緣由是怎麼致使崩潰的,其實本身仍是沒有搞清楚。io

    由於本身用Qt比較熟練,因此開始考慮在Qt中調用matlab生成的dll,其實原理都同樣很簡單。編譯

    在pro中配置好lib庫以及須要的頭文件,編譯經過OK,運行的時候出現初始化失敗!鬱悶。想了很久也想不出緣由。後來過了一天。翻閱網上的帖子忽然考到vs編譯器版本問題。忽然意識到有多是編譯器版本的問題。function

    首先說一下本身電腦上的各類版本:本身電腦上首先matlab版本有2013b 2015b,2016a這幾個版本   vs2010 vs2013  Qt5.5.1-vs2013(32位) Qt5.5.1-vs2010(32位和64位)

    看着都亂~  

    生成dll我是用matlab2016a 選擇的編譯器是vs2013 C++,編譯出來的dll 在vs2013 64位環境下運行ok的,可是在Qt5.5.1-2010(64)運行就出現初始化失敗。仔細推敲發現。個人64位Qt是vs2010版本的,而生成matlab的dll是用vs2013 C++編譯器生成的。版本不對應。

   因而乎。。。將matlab的編譯器選擇成vs2010 C++版本   生成dll 而後在Qt運行,又出問題了出現。

   報錯:

    An Error has occurred while trying to initialize the MATLAB Runtime.

   The error is: Fatal error loading library D:\software\matlab2016a\bin\win64\libmat.dll Error: 找不到指定的程序。

   這是什麼鬼~  libmat.dll調用亂了嗎(電腦中,matlab版本不少),那就找到對應的libmat.dll  copy到運行目錄下,繼續運行  仍是一樣的錯誤。。鬱悶啊   

   雙擊exe程序,出現沒法定位程序輸入點於icuuc54.dll,那就將這個dll拷貝到運行目錄下  運行!哇塞   成功了!居然運行出來。

   不過好像有個警告

   SetThrowSegvLongjmpSEHFilter(): filter function installed

   SetThrowSegvLongjmpSEHFilter(): filter function installed

   出現了上面兩行東東~   

   什麼緣由呢。。。沒有搞懂。

   至此   也就是matab和vs  Qt混合編程算是成功了   誰知後面正式用的時候還會出現什麼問題。

   後續若有新的發現。會繼續跟蹤的!

   使用又發現了問題,同時調用兩個matlab導出的dll,會出現第二個函數初始化失敗。

   怎麼辦呢?嘗試發現  屏蔽第一個函數的初始化,只初始化第二函數,而後就能夠經過了。

  我就想。是否是調用多個dll,只須要初始化一個呢,因而乎  測試了一下  初始化第一個函數  調用第二個函數  呃呃呃   程序崩潰了!

  算了  看來同時只能調用一個(這個只是臨時這麼認爲,相信必定有解決辦法的,只是如今沒有找到而已)。

相關文章
相關標籤/搜索