Reputation: 35
I'm trying to compile a c++ program which contains Matlab's provided engine header. File MLP.cpp contains:
#include <engine.h>
#include <stdlib.h>
#include <iostream>
#include <string>
using namespace std;
And references the matlab functions highlighted in the errors below. When running:
g++ -c MLP.cpp -I/usr/local/matlab/extern/include -L/usr/local/matlab/extern/lib -llibeng -llibmx -lmatlab
g++ MLP.o -o main
I get the following errors:
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
I have also tried changing the compilation commands to:
g++ -c MLP.cpp -I/usr/local/matlab/extern/include -L/usr/local/matlab/bin/glnxa64 -llibeng -llibmx -lmatlab
g++ MLP.o -o main
Upvotes: 1
Views: 1536
Reputation: 174
First g++ command you specify is for compiling, you need only -I
option for that. Give it path to folder where engine.h
is (-I$MATLABROOT/extern/include
- Let's say MATLABROOT
points to root directory of Matlab installation, in this case /usr/local/matlab
).
Second g++ command is for linking, you need to put -L and -l(s) there. Something like
-L$MATLABROOT/bin/glnxa64 -leng -lmx
So we end up with this sequence:
g++ -c MLP.cpp -I$MATLABROOT/extern/include
g++ MLP.o -o main -L$MATLABROOT/bin/glnxa64 -leng -lmx
For getting the same, but in a single line:
g++ MLP.c -o main -I$MATLABROOT/extern/include -L$MATLABROOT/bin/glnxa64 -leng -lmx
Note: libeng.so
and libmx.so
must be reachable when you want to run this executable, so extend LD_LIBRARY_PATH
or PATH
with folder: $MATLABROOT/bin/glnxa64
before attempting to run main
.
Upvotes: 1
Reputation: 124563
The easiest method to compile engine programs is to use the mex
command along with the supplied options file engopts.sh
:
>> engopts = fullfile(matlabroot,'bin','engopts.sh');
>> mex('-f',engopts, 'MLP.cpp')
If you want you could run the above with the verbose flag mex -v ...
, and copy the generated compilation and linking flags into your own build system.
(I believe the problem is that you should drop the lib
part from the library names: g++ file.cpp -I${MROOT}/extern/include -L${MROOT}/extern/lib/${ARCH} -leng -lmx
)
Note: dont forget to set the LD_LIBRARY_PATH
so that your program is able to find the required MATLAB shared libraries when run.
See these pages for more info.
Upvotes: 0
Reputation: 30579
On 64-bit Linux, you probably want change the lib path to:
${MATLABROOT}/extern/lib/glnxa64
Upvotes: 0