ページ 11

VC++2008 Matlabエンジン

Posted: 2012年3月08日(木) 19:52
by takumi@0832080.com
CPU Intel core i7 3.20GHz
メモリ(RAM) 6.00GB
OS windows7 64bit
開発環境 VC++2008 Matlab2011

VC++2008上でMatlabエンジンを起動しようとしています.(C++ or C言語からMatlabのライブラリを呼び出すことが目的)
インクルードファイル,ライブラリファイルは大体オプションで設定しました.
プログラム上でengine.h(おそらく関数や構造体などのプロトタイプ宣言のみ記述されているヘッダ)インクルードした所エラーは無いが,engOpen関数を使うと未解決という状態です.

ライブラリファイルが足りないのかもと考えてます.分かる方お願いします.

(すでに設定したライブラリは.....
libeng.lib,
libmat.lib,
libmex.lib,
libmwblas.lib,
libmwblascompat32.lib,
libmwlapack.lib,
libmwmathutil.lib,
libmx.lib,
libut.lib
以上です.)

Re: VC++2008 Matlabエンジン

Posted: 2012年3月10日(土) 16:11
by ブルボン
えーと、OSが64bitのようですが、Matlabは何bit版をインストールされましたか。
VC++ 2008では64bitコンパイルできなかったと思うのですが。
ほぼ同じ環境でやったとき、ほぼ同じ問題で躓いた覚えがありますが、確かそのあたりが問題だった気がします。

Re: VC++2008 Matlabエンジン

Posted: 2012年3月12日(月) 23:45
by takumi@0832080.com
ブルボン さんが書きました:えーと、OSが64bitのようですが、Matlabは何bit版をインストールされましたか。
VC++ 2008では64bitコンパイルできなかったと思うのですが。
ほぼ同じ環境でやったとき、ほぼ同じ問題で躓いた覚えがありますが、確かそのあたりが問題だった気がします。
返信有難う御座います。遅くなりました。MatLab2011 は64bitです。
engOpen関数等のの本体(処理)が定義されているlibファイルをライブラリファイルに設定出来ればいけるかなとは思っているのですが・・・。
(追記 Matlabのコマンドライン上等からC++のプログラムを実行することには上記の環境で既に成功してます。)

Re: VC++2008 Matlabエンジン

Posted: 2012年3月15日(木) 23:43
by ブルボン
こちらも遅くなりました。
前回の回答は結局何が言いたかったのか伝わりにくかったと思います。
すみません。

Matlab 2011を64bitでインストールされたということですが、ということは、コンパイル時にリンクされているライブラリlibeng.lib等は64bit用ではなかろうか、ということです。
この場合、32bitコンパイルしかできないVC++ 2008では64bitのライブラリは扱うことができないものと思われます。
このあたり、詳しくは知りませんが、ライブラリ自体が64bitコンパイルされていれば、そのライブラリをリンクしてコンパイルするときも64bit環境で行う必要があると思います。

つまり、私の考えでは、コンパイルを通すためには、
1、VC++ 2008が32bitコンパイルしかできないので、Matlab 2011を32bit版でインストールする
2、Matlab 2011を64bit版で使いたいので、VC++ 2010等64bitコンパイル環境があるコンパイラを使う
上記のどちらかの手段しかないのではないか、ということです。

Matlabを32bit版でインストールすると書いてありますが、本当は32bit用のMatlabエンジンライブラリが手に入ればそれに越したことはないのですが、おそらく開発元のMathWorksはそういったものは提供していないのではないかな・・・

追記に関しては、Matlab側からC++のプログラムを呼び出すのと、C++側からMatlab側のライブラリをリンクしてコンパイルすることとでは、やっていることが違うので、参考にはならないと思います。

Re: VC++2008 Matlabエンジン

Posted: 2012年3月16日(金) 10:22
by 沖 滉均
ちょっと1点気になることがあったのですがVisual C++ 2008というのは
Express Editionでしょうか?
Professional Editionでしょうか?

Express Editionであれば、ブルボンさんの仰るとおり64-bitでのコンパイルはできないので、VC++ Express 2010を入れるか32-bitライブラリを入手するかする必要があると思います。
VC++ 2008 Proであれば、64-bitビルド用のライブラリを入手することが可能なようです
http://msdn.microsoft.com/ja-jp/library ... 90%29.aspx
オフトピック
英語圏のページを探すと、Professional用の64-bitコンポーネントをExpress Editionで使用できるようにする方法等も見つかるのですが、公式に認められていない方法のようなのでリンクは貼りません。
まぁ、Express Editionだったらブルボンさんの提案されている方法で…

Re: VC++2008 Matlabエンジン

Posted: 2012年3月16日(金) 17:39
by takumi@0832080.com
沖 滉均 さんが書きました: ちょっと1点気になることがあったのですがVisual C++ 2008というのは
Express Editionでしょうか?
Professional Editionでしょうか?

Express Editionであれば、ブルボンさんの仰るとおり64-bitでのコンパイルはできないので、VC++ Express 2010を入れるか32-bitライブラリを入手するかする必要があると思います。
VC++ 2008 Proであれば、64-bitビルド用のライブラリを入手することが可能なようです
http://msdn.microsoft.com/ja-jp/library ... 90%29.aspx

ブルボン さんが書きました:こちらも遅くなりました。
前回の回答は結局何が言いたかったのか伝わりにくかったと思います。
すみません。

Matlab 2011を64bitでインストールされたということですが、ということは、コンパイル時にリンクされているライブラリlibeng.lib等は64bit用ではなかろうか、ということです。
この場合、32bitコンパイルしかできないVC++ 2008では64bitのライブラリは扱うことができないものと思われます。
このあたり、詳しくは知りませんが、ライブラリ自体が64bitコンパイルされていれば、そのライブラリをリンクしてコンパイルするときも64bit環境で行う必要があると思います。

つまり、私の考えでは、コンパイルを通すためには、
1、VC++ 2008が32bitコンパイルしかできないので、Matlab 2011を32bit版でインストールする
2、Matlab 2011を64bit版で使いたいので、VC++ 2010等64bitコンパイル環境があるコンパイラを使う
上記のどちらかの手段しかないのではないか、ということです。

Matlabを32bit版でインストールすると書いてありますが、本当は32bit用のMatlabエンジンライブラリが手に入ればそれに越したことはないのですが、おそらく開発元のMathWorksはそういったものは提供していないのではないかな・・・

追記に関しては、Matlab側からC++のプログラムを呼び出すのと、C++側からMatlab側のライブラリをリンクしてコンパイルすることとでは、やっていることが違うので、参考にはならないと思います。
返信ありがとうございます。VC++2008proだったので64bitコンパイル環境の設定を行いました。

結果として、engOpenで起動してengCloseで終了するだけのプログラムがビルド出来ますが、下記の警告が出ます。

1>ttt.obj : warning LNK4248: 未解決の typeref トークン (0100000E) ('engine') です。イメージを実行できません。

またここで作られるexeファイルをデバックなしで実行した所、下記がコマンドプロンプト上に表示されます。

このアプリケーションのサイド バイ サイド構成が正しくないため、アプリケーションを開始出来ませんでした。
詳細については、アプリケーションのイベント ログを参照するかコマンドラインツールsxstrace.exeを使用してください。

またこちらを解決するべく下記をインストールしましたが解決しませんでした。わかる方お願いします。

Microsoft Visual C++ 2008 SP1 再頒布可能パッケージ (x64)

Re: VC++2008 Matlabエンジン

Posted: 2012年3月16日(金) 17:41
by ISLe
WindowsSDKに付いている64ビットコマンドラインコンパイラセットをExpressで使用する分にはライセンス上も問題ないと思います。

Re: VC++2008 Matlabエンジン

Posted: 2012年3月16日(金) 19:09
by ISLe
LNK4248はMSILの不完全定義がネイティブの完全定義とリンクされるときに出るそうです。
CLRアプリケーションとして作成しなくてはいけなかったりしないですか?

サイドバイサイド構成についてはメッセージにある通り、イベントログ等で要求されたバージョンと参照されたバージョンを確認してください。
要求されたバージョンと同じバージョンのランタイムをインストールする必要があると思います。

Matlabの要件としてドキュメントされてないのでしょうか。

Re: VC++2008 Matlabエンジン

Posted: 2012年3月16日(金) 21:19
by takumi@0832080.com
ISLe さんが書きました:LNK4248はMSILの不完全定義がネイティブの完全定義とリンクされるときに出るそうです。
CLRアプリケーションとして作成しなくてはいけなかったりしないですか?

サイドバイサイド構成についてはメッセージにある通り、イベントログ等で要求されたバージョンと参照されたバージョンを確認してください。
要求されたバージョンと同じバージョンのランタイムをインストールする必要があると思います。

Matlabの要件としてドキュメントされてないのでしょうか。
返信有難う御座います.色々調べて以下のようにしてみました.
共通言語ランタイムサポートを /clrから使用しないに変更して,
ランタイムライブラリを マルチスレッドデバッグ/MTd にしたところ
ビルドの際の警告は0になりました.
しかし実行すると下記のエラーが表示されプログラムは実行されません.

コンピューターにlibeng.dllがないため,プログラムを開始出来ません.
この問題を解決するにはプログラムを再インストールしてください.

ただしlibeng.dll等は全てちゃんとフォルダに入っているため,何故無いと言われているのかが分かりません.
何か分かる方いましたらお願いします.

Re: VC++2008 Matlabエンジン

Posted: 2012年3月16日(金) 21:34
by takumi@0832080.com
環境変数にdllのパスを入れたら解決しました。
数々のご意見頂きまして本当に助かりました。
有難うございます。