1

C++ プログラムで Matlab ライブラリを使用しようとしています。

#include <cstdlib>
#include <cstdio>
#include <string.h>
#include "engine.h"

using namespace std;


int main(int argc, char** argv) {
    Engine* mweng = engOpen("");
    engEvalString(mweng, "n = func(5)");
    printf ("%d",engGetVariable(mweng, "n"));

    engClose(mweng);
    return 0;
}

インクルード ディレクトリを使用して g++ でプロジェクトをコンパイルするMATLABROOT\extern\includeと、次のエラーが発生します。

build/Debug/Cygwin-Windows/main.o: In function `main':
/cygdrive/d/Projects/Task1/main.cpp:10: undefined reference to `_engOpen'
/cygdrive/d/Projects/Task1/main.cpp:11: undefined reference to `_engEvalString'
/cygdrive/d/Projects/Task1/main.cpp:12: undefined reference to `_engGetVariable'
/cygdrive/d/Projects/Task1/main.cpp:14: undefined reference to `_engClose'
collect2: ld returned 1 exit status
make[2]: *** [dist/Debug/Cygwin-Windows/task1.exe] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2

一部の Matlab ライブラリのリンクに問題があると思います。

更新: VS2012 と Windows コンパイラにも同じ問題があります。リンカーに追加されるのと同じようextern\includeに、 に含まれるディレクトリ。@jucestain のコメントによると、ファイルはリンカー オプションに追加されました。Additional include directoriesextern\lib\win64\microsoftAdditional library dependencieslibeng.libAdditional dependencies

更新 2: 互換性の問題が検出されました: 32 ビット gcc は 64 ビット Matlab エンジンでは動作しません。/externそのため、 32 ビット Matlab のフォルダーを自分のフォルダーとマージし/extern、含まれているリンカー ライブラリを に変更する/extern/lib/win32/lccと、コードが正常にコンパイルされました。@aircooled に感謝!

4

1 に答える 1

0

これは、main.exe を取得するために cygwin プロンプトで使用する行です。

$ g++ main.cpp -o main.exe -I/cygdrive/c/Program\ Files/MATLAB/R2009b/extern/include -L/cygdrive/c/Program\ Files/MATLAB/R2009b/extern/lib/win32/microsoft -llibeng

gccソースとライブラリを提供する順序が重要であることに注意してください。ライブラリよりも最初のソースです。

于 2013-10-18T13:03:03.113 に答える