俺言語。

自分にしか理解できない言語で書かれた備忘録

【MATLAB, C++, Python】C++(.dll)でMATLABエンジンを呼び出す際の落とし穴

落とし穴1

MATLAB R2017b以前と以降とでC++からMATLABを呼び出す方法が変わった模様。
engOpen(NULL) で呼び出す方法はR2017b以前まで。

f:id:hukkuramamemoti:20210109171128p:plain
C からの MATLAB の呼び出し - MATLAB & Simulink - MathWorks 日本


同方法で MATLAB R2020を呼び出すとMATLABのウィンドウは立ち上がるがすぐに落ちて Noneが返ってくる。

落とし穴2

バージョン違いで複数のMATLABがインストールされていると最後にインストールされたMATLABが起動する。
(R2017b以前で有効な起動方法のみ。R2018以降の方法は未確認)
自分の環境ではR2016aとR2020aがインストールされていてR2020aを後からインストールしたため、MATLABエンジンがうまく呼び出せていなかった。

どのMATLABが起動するかは環境変数のパスに記載された順ではなくCOMサーバーとして登録されたMATLABバージョンが起動するという仕組みのため。
f:id:hukkuramamemoti:20210109170701p:plain

変更方法は下記を参照:
https://jp.mathworks.com/help/releases/R2016a/matlab/matlab_external/register-matlab-as-automation-server.html#buq2zk5