Я пытаюсь скомпилировать программу на c ++, которая содержит заголовок движка, предоставленный Matlab. Файл 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
Первая указанная вами команда 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.so
а также libmx.so
должен быть доступен, если вы хотите запустить этот исполняемый файл, поэтому продлите LD_LIBRARY_PATH
или же PATH
с папкой: $MATLABROOT/bin/glnxa64
прежде чем пытаться бежать main
,
В 64-битном Linux вы, вероятно, захотите изменить путь к lib:
$ {MATLABROOT} / ехЬегп / Библиотека / glnxa64
Самый простой метод для компиляции программ движка — это использовать 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 при запуске.
Увидеть эти страницы для получения дополнительной информации.