尝试使用标头从c ++访问matlab

时间:2013-11-13 22:47:56

标签: c++ matlab gcc linker matlab-engine

我正在尝试编译一个包含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

3 个答案:

答案 0 :(得分:1)

您指定的第一个g ++命令用于编译,您只需要-I选项。将它指向engine.h所在的文件夹的路径(-I$MATLABROOT/extern/include - 假设MATLABROOT指向Matlab安装的根目录,在本例中为/usr/local/matlab)。

第二个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

为了获得相同的信息,但只需一行:

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

注意:当您要运行此可执行文件时,必须可以访问libeng.solibmx.so,因此请先尝试使用文件夹LD_LIBRARY_PATH扩展PATH$MATLABROOT/bin/glnxa64运行main

答案 1 :(得分:0)

在64位Linux上,您可能希望将lib路径更改为:

  

$ {MATLABROOT} /的extern / LIB / glnxa64

答案 2 :(得分: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共享库。

有关详细信息,请参阅these pages