2016-01-25 2 views
1

Я попытался создать модель OpenModelica с потоком жидкости и носителем. И у меня есть функция в Matlab, которая вычисляет PDE (уравнение с частными производными) в pdetool. Я хотел бы создать общую динамическую библиотеку (.so-файл) в Matlab с помощью MCR и загрузить ее в модель. Моя платформа: OpenModelica, используемая на Linux или Mac OS. MCR на Linux и Mac OS.Как загрузить общую библиотеку, созданную в Matlab

В Matlab я могу сгенерировать только DLL (возможно, можно создать libmyfunc.so?).

Когда я пытаюсь скомпилировать модель с экстерном функцией C Я получил ошибку:

#omc +s test_matlab_so.mo func_mathlab.mo 
#make -f test_matlab_so.makefile 
/usr/bin/clang -Wimplicit-function-declaration -O0 -falign-functions -march=native  -I"/opt/openmodelica/include/omc/c" -I. -DOPENMODELICA_XML_FROM_FILE_AT_RUNTIME -c -o test_matlab_so_functions.o test_matlab_so_functions.c 
clang: warning: optimization flag '-falign-functions' is not supported 
clang: warning: argument unused during compilation: '-falign-functions' 
In file included from test_matlab_so_functions.c:7: 
In file included from ./test_matlab_so_includes.h:4: 
./shared_train/src/lib_summ.c:90:8: warning: implicit declaration of function 'GetModuleFileName' is invalid in C99 [-Wimplicit-function-declaration] 
    if (!GetModuleFileName(GetModuleHandle("lib_summ"), path_to_dll, _MAX_PATH)) 
    ^
./shared_train/src/lib_summ.c:90:26: warning: implicit declaration of function 'GetModuleHandle' is invalid in C99 [-Wimplicit-function-declaration] 
    if (!GetModuleFileName(GetModuleHandle("lib_summ"), path_to_dll, _MAX_PATH)) 
         ^
./shared_train/src/lib_summ.c:90:55: error: use of undeclared identifier 'path_to_dll' 
    if (!GetModuleFileName(GetModuleHandle("lib_summ"), path_to_dll, _MAX_PATH)) 
                ^
./shared_train/src/lib_summ.c:90:68: error: use of undeclared identifier '_MAX_PATH' 
    if (!GetModuleFileName(GetModuleHandle("lib_summ"), path_to_dll, _MAX_PATH)) 
                   ^
./shared_train/src/lib_summ.c:94:37: error: use of undeclared identifier 'path_to_dll' 
      mclGetEmbeddedCtfStream(path_to_dll); 
            ^
test_matlab_so_functions.c:19:16: warning: implicit declaration of function '_mlfSumm' is invalid in C99 [-Wimplicit-function-declaration] 
    _v_out_ext = _mlfSumm(_v_a_ext, _v_b_ext); 
      ^
3 warnings and 3 errors generated. 
make: *** [test_matlab_so_functions.o] Error 1 

Может кто-то помочь мне с интеграцией OpenModelica и Matlab?

ответ

1

У меня нет большого опыта работы с Linux, но я сделал то же самое в Windows, используя MCR. Проверьте это: http://de.mathworks.com/matlabcentral/answers/94471-how-do-i-create-a-c-c-shared-library-with-matlab-compiler-that-can-be-used-in-a-microsoft-visual-c

Когда вы это сделаете, вы получите библиотеку DLL, а также статическую библиотеку. Вам нужно скопировать их обоих в папку, в которой находится ваш код modelica, а затем установить библиотеку в функции «Библиотека» вашей функции modelica, которая вызывает внешнюю функцию.

Имейте в виду, что если вы используете 64-разрядную dymola 64 или 32 бит, вы должны создать DLL, используя ту же самую версию matlab соответственно.

+0

Благодарим вас за ответ. Согласно документу Matlab и документации OpenModelica об использовании функций extern C мне нужно сделать 1) создать общий lib в Matlab. 2) Напишите простую c-оболочку c для инициализации процедуры MCR и вызовите мою общую lib. 3) Вызовите мою оболочку C из OpenModelica. Правильно ли это? – vserge

+0

Да, точно. Я создал две разделяемые библиотеки один из моего файла matlab, а другой - из оболочки c, которую я тогда использовал в Dymola. – Shaga

+0

Благодарю вас! Мы сделали это, но получили следующую проблему: загрузить dll в Linux;) – vserge

Смежные вопросы