1

Matlab が提供するエンジン ヘッダーを含む C++ プログラムをコンパイルしようとしています。ファイル MLP.cpp には以下が含まれます。

#include <engine.h>
#include <stdlib.h>
#include <iostream>
#include <string>
using namespace std;

以下のエラーで強調表示されている matlab 関数を参照します。実行時:

g++ -c MLP.cpp -I/usr/local/matlab/extern/include -L/usr/local/matlab/extern/lib -llibeng -llibmx -lmatlab
g++ MLP.o -o main

次のエラーが表示されます。

MLP.o: In function `MatLabPredictor::MatLabPredictor(char*)': 

MLP.cpp:(.text+0x18): undefined reference to `engOpen'

MLP.cpp:(.text+0x36): undefined reference to `engEvalString'

MLP.cpp:(.text+0x4a): undefined reference to `engEvalString'

MLP.cpp:(.text+0x5e): undefined reference to `mxCreateDoubleMatrix'

MLP.cpp:(.text+0x79): undefined reference to `mxGetPr'

MLP.o: In function `MatLabPredictor::~MatLabPredictor()':

MLP.cpp:(.text+0xa1): undefined reference to `engClose'

MLP.o: In function `MatLabPredictor::retrain(double)':

MLP.cpp:(.text+0x104): undefined reference to `engPutVariable'

MLP.cpp:(.text+0x118): undefined reference to `engEvalString'

MLP.cpp:(.text+0x12c): undefined reference to `engEvalString'

MLP.cpp:(.text+0x140): undefined reference to `engEvalString'

MLP.o: In function `MatLabPredictor::predict_next_value()':

MLP.cpp:(.text+0x162): undefined reference to `engEvalString'

MLP.cpp:(.text+0x176): undefined reference to `engGetVariable'

MLP.cpp:(.text+0x186): undefined reference to `mxGetData'

MLP.cpp:(.text+0x199): undefined reference to `mxDestroyArray'
collect2: ld returned 1 exit status

また、コンパイル コマンドを次のように変更しようとしました。

g++ -c MLP.cpp -I/usr/local/matlab/extern/include -L/usr/local/matlab/bin/glnxa64 -llibeng -llibmx -lmatlab
g++ MLP.o -o main
4

3 に答える 3

1

最初に指定する g++ コマンドはコンパイル-I用です。そのためのオプションのみが必要です。フォルダへのパスを指定しますengine.h( -この場合、Matlab インストールのルート ディレクトリを指しているとし-I$MATLABROOT/extern/includeましょう)。MATLABROOT/usr/local/matlab

2 番目の g++ コマンドはリンク用です。そこに -L と -l(s) を配置する必要があります。何かのようなもの -L$MATLABROOT/bin/glnxa64 -leng -lmx

したがって、次のシーケンスになります。

g++ -c MLP.cpp -I$MATLABROOT/extern/include

g++ MLP.o -o main -L$MATLABROOT/bin/glnxa64 -leng -lmx

同じものを取得するには、1行で:

g++ MLP.c -o main -I$MATLABROOT/extern/include -L$MATLABROOT/bin/glnxa64 -leng -lmx

注: この実行可能ファイルを実行する場合はlibeng.so、 andlibmx.soにアクセスできる必要があるため、実行を試みる前にLD_LIBRARY_PATHor PATHwith folder: を拡張します。$MATLABROOT/bin/glnxa64main

于 2013-11-15T11:00:36.613 に答える
0

エンジン プログラムをコンパイルする最も簡単な方法は、mexコマンドを提供されたオプション ファイルと共に使用することですengopts.sh

>> engopts = fullfile(matlabroot,'bin','engopts.sh');
>> mex('-f',engopts, 'MLP.cpp')

必要に応じて、詳細フラグを指定して上記を実行しmex -v ...、生成されたコンパイルおよびリンク フラグを独自のビルド システムにコピーできます。

(問題はlib、ライブラリ名からパーツを削除する必要があることだと思いますg++ file.cpp -I${MROOT}/extern/include -L${MROOT}/extern/lib/${ARCH} -leng -lmx:)

LD_LIBRARY_PATH注:プログラムが実行時に必要な MATLAB 共有ライブラリを見つけられるように、を設定することを忘れないでください。

詳細については、これらの ページを参照してください。

于 2013-11-14T17:13:09.210 に答える