俺言語。

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

【MATLAB,C++,Python】C++でMATLABエンジンを呼び出す

ようやく動いたのでメモ。
目標はC++のDLLをPythonのctypesで読み込んでPythonからMATLABエンジンの使用。
(Matlabが2016以降であればPythonからコントロール可能なのでこんなめんどくさいのは不要)

f:id:hukkuramamemoti:20151223235514p:plain
ポイント1.64bit環境(MATLABも)なのでプラットフォームは64bitを選択
ポイント2.インクルードファイルには"engine.h"があるフォルダを選択
ポイント3.ライブラリファイルには"libeng.lib"があるフォルダを選択
ポイント4? 実行ファイルディレクトリにMATLAB.exeがあるフォルダを選択
      今回は環境変数に入っていたので省略

f:id:hukkuramamemoti:20151224000030p:plain
f:id:hukkuramamemoti:20151224000104p:plain
ポイント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を使って依存ライブラリをチェック。

f:id:hukkuramamemoti:20170102124245j:plainf:id:hukkuramamemoti:20170102124313j:plain

IESHIMS.dllとDCOMP.dllは検索してみると結構みんな同じエラーが発生している、が
結局はなくても大丈夫そうな感じ。

結局,VC++2008再頒布可能パッケージをインストールすると解決。
libeng.dllをコンパイルしたのがVC++2008だったのかな。