【MATLAB,C++,Python】C++でMATLABエンジンを呼び出す
ようやく動いたのでメモ。
目標はC++のDLLをPythonのctypesで読み込んでPythonからMATLABエンジンの使用。
(Matlabが2016以降であればPythonからコントロール可能なのでこんなめんどくさいのは不要)
ポイント1.64bit環境(MATLABも)なのでプラットフォームは64bitを選択
ポイント2.インクルードファイルには"engine.h"があるフォルダを選択
ポイント3.ライブラリファイルには"libeng.lib"があるフォルダを選択
ポイント4? 実行ファイルディレクトリにMATLAB.exeがあるフォルダを選択
今回は環境変数に入っていたので省略
ポイント4.リンカに.libファイルを登録
ポイント5.PCの環境変数に"libeng.dll"があるフォルダを登録
(VisualStudioの設定ではない)
今回だと C:\Program Files\MATLAB\R2015a\bin\win64
これがないとビルドは出来ても実行時に「.dllがない」と怒られる
ポイント6.C++でdllを作った場合,C言語からのアクセスを可能にするために
C++のコード内に下記を記述
extern "C" __declspec(dllexport) int ***(***)
参考:How to write a DLL/SO in C/C++ for Python - Articles
# 2017.1.2追記---
PCを入れ替えて上記で作ったプログラムを動かしてみたところ,動作せず。
Pythonでのエラーメッセージは
"指定したパスが見つかりません"
しかしos.path.exists("path")でパスが間違っていないかチェックしたところ
ちゃんとTrueが返ってくる(パスは間違っていない)
ここでおそらく他のライブラリが無いor読み込めていないと判断。
visualstudioに付属のdumpbin.exeとDependency walkerを使って依存ライブラリをチェック。
IESHIMS.dllとDCOMP.dllは検索してみると結構みんな同じエラーが発生している、が
結局はなくても大丈夫そうな感じ。
結局,VC++2008再頒布可能パッケージをインストールすると解決。
libeng.dllをコンパイルしたのがVC++2008だったのかな。