вызовите Matlab из C ++ в Ubuntu - PullRequest
0 голосов
/ 30 мая 2019

Я пытаюсь вызвать функцию Matlab из C ++ (для NS-3) в Eclipse IDE в Ubuntu 18.04.Я использовал Matlab Library Compiler для компиляции файла .m в общую библиотеку C ++.Как правильно вызвать функцию?

Соответствующая среда выполнения MATLAB установлена ​​и настроена.Сначала он не может найти «mclmcrrt.h», я скопировал папку / usr / local / MATLAB / R2018b / extern / include и изменил заголовок библиотеки, добавив «./include/mclmcrrt.h».Затем среда IDE может правильно найти файлы заголовков.

Сценарий C ++ для проверки библиотеки следующим образом:

/* C = A+B */
#include <iostream>
#include "libtestAdd.h"

using namespace std;

int main(){
    double A[] = {1};
    double B[] = {2};
    int nargout = 1;

    mwArray input_A (1,1,mxDOUBLE_CLASS,mxREAL);
    input_A.SetData(M,1);
    mwArray input_B (1,1,mxDOUBLE_CLASS,mxREAL);
    input_B.SetData(K,1);
    mwArray C (1,1,mxDOUBLE_CLASS,mxREAL);

    if (!mclInitializeApplication(NULL,0)){
        std::cerr << "Could not initialize the application properly."
                  << std::endl;
        return -1;
    }
    libtestAddInitialize();
    testAdd(nargout, C, input_A, input_B);
    libtestAddTerminate();

    return 1;
}

Функция Matlab - C = A + B.

Файл .m был скомпилирован в общую библиотеку C ++ («libtestAdd.so» и «libtestAdd.h»).Сценарий C ++ пытается вызвать функцию «testAdd» из библиотеки.

Matlab Runtime был правильно установлен./ etc / profile был изменен для экспорта следующего пути к переменной среды LD_LIBRARY_PATH:

/usr/local/MATLAB/MATLAB_Runtime/v95/runtime/glnxa64:/usr/local/MATLAB/MATLAB_Runtime/v95/bin/glnxa64:/usr/local/MATLAB/MATLAB_Runtime/v95/sys/os/glnxa64

Сообщения об ошибках выглядят следующим образом:

~/Desktop/libtestAdd/for_testing$ cd "/home/csrl/Desktop/libtestAdd/for_testing/" && g++ main.cpp -o main && "/home/csrl/Desktop/libtestAdd/for_testing/"main
/tmp/ccyFn7iq.o: In function `main':
main.cpp:(.text+0xde): undefined reference to `libtestAddInitialize'
main.cpp:(.text+0xf4): undefined reference to `testAdd(int, mwArray&, mwArray const&, mwArray const&)'
main.cpp:(.text+0xf9): undefined reference to `libtestAddTerminate'
/tmp/ccyFn7iq.o: In function `mwException::mwException()':
main.cpp:(.text._ZN11mwExceptionC2Ev[_ZN11mwExceptionC5Ev]+0x46): undefined reference to `mclcppCreateError_proxy'
/tmp/ccyFn7iq.o: In function `mwException::mwException(char const*)':
main.cpp:(.text._ZN11mwExceptionC2EPKc[_ZN11mwExceptionC5EPKc]+0x5a): undefined reference to `mclcppCreateError_proxy'
/tmp/ccyFn7iq.o: In function `mwException::mwException(error_info*, bool)':
main.cpp:(.text._ZN11mwExceptionC2EP10error_infob[_ZN11mwExceptionC5EP10error_infob]+0x61): undefined reference to `ref_count_obj_addref_proxy'
main.cpp:(.text._ZN11mwExceptionC2EP10error_infob[_ZN11mwExceptionC5EP10error_infob]+0x7a): undefined reference to `mclcppCreateError_proxy'
/tmp/ccyFn7iq.o: In function `mwException::~mwException()':
main.cpp:(.text._ZN11mwExceptionD2Ev[_ZN11mwExceptionD5Ev]+0x36): undefined reference to `ref_count_obj_release_proxy'
/tmp/ccyFn7iq.o: In function `mwException::what() const':
main.cpp:(.text._ZNK11mwException4whatEv[_ZNK11mwException4whatEv]+0x25): undefined reference to `error_info_get_message_proxy'
/tmp/ccyFn7iq.o: In function `mwException::raise_error()':
main.cpp:(.text._ZN11mwException11raise_errorEv[_ZN11mwException11raise_errorEv]+0x2a): undefined reference to `mclcppGetLastError_proxy'
/tmp/ccyFn7iq.o: In function `mwArray::mwArray(unsigned long, unsigned long, mxClassID, mxComplexity)':
main.cpp:(.text._ZN7mwArrayC2Emm9mxClassID12mxComplexity[_ZN7mwArrayC5Emm9mxClassID12mxComplexity]+0x52): undefined reference to `mclGetMatrix_proxy'
/tmp/ccyFn7iq.o: In function `mwArray::~mwArray()':
main.cpp:(.text._ZN7mwArrayD2Ev[_ZN7mwArrayD5Ev]+0x26): undefined reference to `ref_count_obj_release_proxy'
/tmp/ccyFn7iq.o: In function `mwArray::SetData(double*, unsigned long)':
main.cpp:(.text._ZN7mwArray7SetDataEPdm[_ZN7mwArray7SetDataEPdm]+0x2b): undefined reference to `array_ref_set_numeric_mxDouble_proxy'
collect2: error: ld returned 1 exit status

1 Ответ

1 голос
/ 30 мая 2019

Вам нужно связать с файлом .so. Добавьте его в конец вашей команды компиляции.

...