пытаясь получить доступ к Matlab из C ++, используя заголовок

Я пытаюсь скомпилировать программу на 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

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.so а также libmx.so должен быть доступен, если вы хотите запустить этот исполняемый файл, поэтому продлите LD_LIBRARY_PATH или же PATH с папкой: $MATLABROOT/bin/glnxa64 прежде чем пытаться бежать main,

1

Другие решения

В 64-битном Linux вы, вероятно, захотите изменить путь к lib:

$ {MATLABROOT} / ехЬегп / Библиотека / glnxa64

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 при запуске.

Увидеть эти страницы для получения дополнительной информации.

0
По вопросам рекламы [email protected]