I am trying to load a shared library from the sample code provided in the matlab documentation.
addpath(fullfile(matlabroot,‘extern’,‘examples’,‘shrlib’))
if not(libisloaded(‘shrlibsample’))
loadlibrary(‘shrlibsample’)
end
But when it tries to load the library i get an error:
Error using loadlibrary
The MATLAB program file describing your library could not be found, possible Perl or file system error.
Any help is appreciated.
Accepted Answer
Edited: Sandeep
on 26 Jul 2016
I Finally found the solution for this problem. This was caused by a space/carriage return in the Path value of the Environment variable. It was not evident when I manually checked the path. Then i copied it to Notepad++ and found there was a space and a carriage return. Replaced the Path value with the edited path value(removing space and carriage return). Now the loadlibrary function works fine.
PS: The attached image has the markings about what i am talking about. The problem is only with WindowsPowershellV1.0. Ignore the rest.
More Answers (3)
I had a very similar problem: When I tried,
addpath(fullfile(matlabroot,‘extern’,‘examples’,‘shrlib’))
if not(libisloaded(‘shrlibsample’))
loadlibrary(‘shrlibsample’)
end
I got:
Error using loadlibrary
Too many output arguments.
Following @Philip Borghesani’s suggestion, I found that it was the «perl» command that was broken (returning too many outputs).
The problem turned out to be that MATLAB’s built-in perl.m was shadowed by a perl.m in a toolbox I had downloaded from a third party.
Something quite odd is going on, This error is caused by a timeout waiting for the prototype file to be visible to MATLAB after supposedly successful creation. I have only questions and suggestions.
- If your current directory is not writable by you try changing to one that is.
- Make sure your tempdir is writable and the disk is not full
- If nether of these helps or is the problem try using the m_filename option to loadlibrary to specify the name and location of the prototype file that will be generated.
- If all else fails contact support.
Any responses from Matlab Support? Have the same error and tried all steps here.
-
Rukhlenko
- Пользователь
- Сообщения: 284
- Зарегистрирован: Ср сен 22, 2004 4:49 pm
Loadlibrary: Error Message
Недавно случайно обнаружил, что можно обращаться к внешним DLL функциям непосредственно из Матлаба с помощью функций loadlibrary, Calllib. Однако при попытке запустить тестовый пример из doc_loadlibrary:
addpath([matlabroot ‘externexamplesshrlib’])
loadlibrary shrlibsample shrlibsample.h
получаю сообщение об ошибке:
??? Error using ==> loadlibrary
Failed to preprocess the input file.
Output from preprocessor is:’C:Program’ is not recognized as an internal or external command,
operable program or batch file.
В чем может быть причина?
Версия MATLAB:
————————————————————————————-
MATLAB Version 7.0.4.365 (R14) Service Pack 2
MATLAB License Number: xxxxxx
Operating System: Microsoft Windows XP Version 5.1 (Build 2600: Service Pack 2)
Java VM Version: Java 1.5.0 with Sun Microsystems Inc. Java HotSpot(TM) Client VM
————————————————————————————-
MATLAB Version 7.0.4 (R14SP2)
Simulink Version 6.2.1 (R14SP2+)
Excel Link Version 2.2.2 (R14SP2)
Genetic Algorithm Direct Search Toolbox Version 1.0.2 (R14SP1)
Image Processing Toolbox Version 5.0.2 (R14SP2)
Optimization Toolbox Version 3.0.2 (R14SP2)
Real-Time Workshop Version 6.2.1 (R14SP2+)
Signal Processing Toolbox Version 6.3 (R14SP2)
Statistics Toolbox Version 5.0.2 (R14SP2)
Symbolic Math Toolbox Version 3.1.2 (R14SP2)
Заранее благодарен
Александр
Последний раз редактировалось Rukhlenko Пт янв 13, 2006 10:27 pm, всего редактировалось 1 раз.
-
gok
- Пользователь
- Сообщения: 127
- Зарегистрирован: Ср сен 22, 2004 4:49 pm
Сообщение gok » Пт янв 13, 2006 10:14 pm
Хм. У меня нормально загрузилась (MATLAB Version 7.1.0.246 (R14) Service Pack 3) Есть sp3, попробуй с ним.
(Я бы номер лицензии не выставлял)
life would be so much easier if we could just look at the source code
-
Rukhlenko
- Пользователь
- Сообщения: 284
- Зарегистрирован: Ср сен 22, 2004 4:49 pm
Сообщение Rukhlenko » Пт янв 13, 2006 10:36 pm
gok писал(а):Хм. У меня нормально загрузилась (MATLAB Version 7.1.0.246 (R14) Service Pack 3) Есть sp3, попробуй с ним.
(Я бы номер лицензии не выставлял)
Я думаю, дело не в сервис-паке. Проверил сейчас дома:
МATLAB Version 7.0.1.24704 (R14) Service Pack 1
MATLAB License Number: xxxxxx
Operating System: Microsoft Windows XP Version 5.1 (Build 2600: Service Pack 2)
Java VM Version: Java 1.4.2_04 with Sun Microsystems Inc. Java HotSpot(TM) Client VM
Нормально запустилось. Есть одна мысль, но может, это глупость. На двух машинах, где работает, Матлаб поставлен в корневом каталоге. Там же, где не работает, — в поддиректории Program Files. Может быть, причина связана с этим?
Справедливости ради надо отметить, что на всех машинах стоят слегка разные версии МАТЛАБ 7.
P.S. Самое смешное, что понятия не имею, как кто-то смог поставить МАТЛАБ в Program Files. Когда я пытался это сделать дома, инсталлятор ругался, что имя директории не должно содержать пробелы, то есть Program Files не проходит.
-
sandy
- Эксперт
- Сообщения: 5601
- Зарегистрирован: Ср сен 22, 2004 4:49 pm
Сообщение sandy » Сб янв 14, 2006 11:00 am
MATLAB стал понимать каталоги с пробелами начиная с R14SP2
С уважением
Александр Сергиенко
-
Rukhlenko
- Пользователь
- Сообщения: 284
- Зарегистрирован: Ср сен 22, 2004 4:49 pm
Сообщение Rukhlenko » Сб янв 14, 2006 12:02 pm
sandy писал(а):MATLAB стал понимать каталоги с пробелами начиная с R14SP2
Спасибо за разъяснение — буду иметь в виду. Хотел бы возвратиться к исходному вопросу: почему не работает loadlibrary и может ли это быть связано с путем к МАТЛАБу. Надо что-то пытаться делать с этим в понедельник. Рассчитываю на какую-то дополнительную информацию к этому времени. Хотя бы найти кого-то с точно такой же версией МАТЛАБа для проверки ситуации.
-
Rukhlenko
- Пользователь
- Сообщения: 284
- Зарегистрирован: Ср сен 22, 2004 4:49 pm
Сообщение Rukhlenko » Пн янв 16, 2006 1:59 pm
Rukhlenko писал(а):
sandy писал(а):MATLAB стал понимать каталоги с пробелами начиная с R14SP2
Спасибо за разъяснение — буду иметь в виду. Хотел бы возвратиться к исходному вопросу: почему не работает loadlibrary и может ли это быть связано с путем к МАТЛАБу. Надо что-то пытаться делать с этим в понедельник. Рассчитываю на какую-то дополнительную информацию к этому времени. Хотя бы найти кого-то с точно такой же версией МАТЛАБа для проверки ситуации.
Проблема решилась после установки версии 7.1 SP3 в корневой каталог. Причина осталась невыясненной, что именно помогло: обновление версии или установка в корневой каталог.
This is a follow-up on issue #1.
I run TwoCircTrailer
(I run it from inside nmpc-codegen-matlab/demos
) and I first get following log messages:
GENERATING output folders of controller:
GENERATING PANOC
GENERATING static globals
GENERATING python interface
GENERATING Build system
Generating globals file at: ../test_controller_builds/demo_controller_matlab/globals/globals_dyn.h
generating g-type function
ans =
Source_file_generator with properties:
location: '../test_controller_builds/demo_controller_matlab/casadi/g.c'
function_type: 'g'
generating proxg-type function
ans =
Source_file_generator with properties:
location: '../test_controller_builds/demo_controller_matlab/casadi/proxg.c'
function_type: 'proxg'
but then there seem to be some issues with compilation…
cmake: /usr/local/MATLAB/R2017a/bin/glnxa64/libcurl.so.4: no version information available (required by cmake)
-- The C compiler identification is GNU 4.8.5
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detected the following casadi files: cost_function_derivative_combined.c;cost_function.c;integrator.c
-- No main.c detected in project root folder
-- Configuring done
-- Generating done
-- Build files have been written to: /home/chung/Documents/nmpc-codegen-matlab/test_controller_builds/demo_controller_matlab/build
cmake: /usr/local/MATLAB/R2017a/bin/glnxa64/libcurl.so.4: no version information available (required by cmake)
/usr/bin/cmake: /usr/local/MATLAB/R2017a/bin/glnxa64/libcurl.so.4: no version information available (required by /usr/bin/cmake)
/usr/bin/cmake: /usr/local/MATLAB/R2017a/bin/glnxa64/libcurl.so.4: no version information available (required by /usr/bin/cmake)
/usr/bin/cmake: /usr/local/MATLAB/R2017a/bin/glnxa64/libcurl.so.4: no version information available (required by /usr/bin/cmake)
/usr/bin/cmake: /usr/local/MATLAB/R2017a/bin/glnxa64/libcurl.so.4: no version information available (required by /usr/bin/cmake)
Scanning dependencies of target PANOC_lib
/usr/bin/cmake: /usr/local/MATLAB/R2017a/bin/glnxa64/libcurl.so.4: no version information available (required by /usr/bin/cmake)
[ 7%] /usr/bin/cmake: /usr/local/MATLAB/R2017a/bin/glnxa64/libcurl.so.4: no version information available (required by /usr/bin/cmake)
Building C object PANOC/CMakeFiles/PANOC_lib.dir/proximal_gradient_descent.c.o
/usr/bin/cmake: /usr/local/MATLAB/R2017a/bin/glnxa64/libcurl.so.4: no version information available (required by /usr/bin/cmake)
[ 15%] /usr/bin/cmake: /usr/local/MATLAB/R2017a/bin/glnxa64/libcurl.so.4: no version information available (required by /usr/bin/cmake)
Building C object PANOC/CMakeFiles/PANOC_lib.dir/buffer.c.o
/usr/bin/cmake: /usr/local/MATLAB/R2017a/bin/glnxa64/libcurl.so.4: no version information available (required by /usr/bin/cmake)
[ 23%] /usr/bin/cmake: /usr/local/MATLAB/R2017a/bin/glnxa64/libcurl.so.4: no version information available (required by /usr/bin/cmake)
Building C object PANOC/CMakeFiles/PANOC_lib.dir/casadi_interface.c.o
In file included from /home/chung/Documents/nmpc-codegen-matlab/test_controller_builds/demo_controller_matlab/PANOC/casadi_interface.c:3:0:
/home/chung/Documents/nmpc-codegen-matlab/test_controller_builds/demo_controller_matlab/PANOC/../casadi/cost_function_derivative_combined.h:12:22: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘void’
CASADI_SYMBOL_EXPORT void cost_function_derivative_combined_incref(void);
^
/home/chung/Documents/nmpc-codegen-matlab/test_controller_builds/demo_controller_matlab/PANOC/../casadi/cost_function_derivative_combined.h:13:22: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘void’
CASADI_SYMBOL_EXPORT void cost_function_derivative_combined_decref(void);
^
/home/chung/Documents/nmpc-codegen-matlab/test_controller_builds/demo_controller_matlab/PANOC/../casadi/cost_function_derivative_combined.h:14:22: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘int’
CASADI_SYMBOL_EXPORT int cost_function_derivative_combined_n_out(void);
^
/home/chung/Documents/nmpc-codegen-matlab/test_controller_builds/demo_controller_matlab/PANOC/../casadi/cost_function_derivative_combined.h:15:22: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘int’
CASADI_SYMBOL_EXPORT int cost_function_derivative_combined_n_in(void);
^
/home/chung/Documents/nmpc-codegen-matlab/test_controller_builds/demo_controller_matlab/PANOC/../casadi/cost_function_derivative_combined.h:16:22: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘const’
CASADI_SYMBOL_EXPORT const char* cost_function_derivative_combined_name_in(int i);
^
/home/chung/Documents/nmpc-codegen-matlab/test_controller_builds/demo_controller_matlab/PANOC/../casadi/cost_function_derivative_combined.h:17:22: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘const’
CASADI_SYMBOL_EXPORT const char* cost_function_derivative_combined_name_out(int i);
^
/home/chung/Documents/nmpc-codegen-matlab/test_controller_builds/demo_controller_matlab/PANOC/../casadi/cost_function_derivative_combined.h:18:22: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘const’
CASADI_SYMBOL_EXPORT const int* cost_function_derivative_combined_sparsity_in(int i);
^
/home/chung/Documents/nmpc-codegen-matlab/test_controller_builds/demo_controller_matlab/PANOC/../casadi/cost_function_derivative_combined.h:19:22: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘const’
CASADI_SYMBOL_EXPORT const int* cost_function_derivative_combined_sparsity_out(int i);
^
/home/chung/Documents/nmpc-codegen-matlab/test_controller_builds/demo_controller_matlab/PANOC/../casadi/cost_function_derivative_combined.h:20:22: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘int’
CASADI_SYMBOL_EXPORT int cost_function_derivative_combined_work(int *sz_arg, int* sz_res, int *sz_iw, int *sz_w);
^
make[3]: *** [PANOC/CMakeFiles/PANOC_lib.dir/casadi_interface.c.o] Error 1
make[2]: *** [PANOC/CMakeFiles/PANOC_lib.dir/all] Error 2
make[1]: *** [CMakeFiles/python_interface.dir/rule] Error 2
make: *** [python_interface] Error 2
Loading nmpc_panoc library n
Error using loadlibrary
There was an error loading the library "../test_controller_builds/demo_controller_matlab/build/libpython_interface.so"
../test_controller_builds/demo_controller_matlab/build/libpython_interface.so: cannot open shared object file: No such file or directory
Error in nmpccodegen.tools.Simulator/load_library (line 77)
[notfound,warnings] = loadlibrary(lib_file_name,lib_file_header_name,'alias','nmpc_panoc');
Error in nmpccodegen.tools.Simulator (line 104)
obj.load_library();
Error in simulate_demo_trailer (line 9)
sim = nmpccodegen.tools.Simulator(trailer_controller.location);
Error in TwoCircTrailer (line 47)
[ state_history,time_history,iteration_history,input_history,~ ] = simulate_demo_trailer(trailer_controller,initial_state,...
Caused by:
Error using loaddefinedlibrary
../test_controller_builds/demo_controller_matlab/build/libpython_interface.so: cannot open shared object file: No such file or directory
I suspect this is because it doesn’t find CASADI_SYMBOL_EXPORT
.
|
использование DLL в Matlab
|
07/10/15 |
Добрый день, Цитата: Undefined function ‘Q_fil’ for input arguments of type ‘double’ то есть Matlab её как бы и не видит, но компиляция прошла нормально, без ошибок (выполнялась с помощью Matlab Compiller, с подключенным внешним компилятором VC2010) сама исходная функция Q_fil.m в Matlab работает нормально, только слишком медленно (собственно из за этого и компилирую) в чём здесь может быть ошибка (у меня Matlab 2013a x64)
|
|
|
Karan |
Posted automatically
|
||||
19/10/15 |
|
||||
|
|||||
GAA |
Re: использование DLL в Matlab
|
||
12/07/07 |
Andrey_Kireew , а функция при помощи loadlibrary загружалась? Если таким способом, то что возвращает libfunctions? (И лучше сразу весь текст загрузки функции привести.)
|
||
|
|||
Andrey_Kireew |
Re: использование DLL в Matlab
|
07/10/15 |
Про loadlibrary ничего не слышал, думал запускать нужно так же как и .m функцию, просто из командной строки matlab. Сейчас попробовал, что то заработало, выполняю команды: Код: >> hfile = fullfile(‘C:’,’Users’,’User’,’Documents’,’MATLAB’,’Q_filt.h’); выдаёт предупреждение Код: Warning: Warnings messages were produced while parsing. Check the смотрю какие функции загрузились Код: >> libfunctions(‘Q_filt’) Functions in library Q_filt: Q_filtInitialize mlfQ_filt как запускать не пойму, пробовал так Код: >> out =calllib(‘Q_filt’,’Q_filtPrintStackTrace’,x,3,1001,0.5); ничего не получается, вообще всё намного сложнее чем я ожидал …
|
|
|
Geen |
Re: использование DLL в Matlab
|
||
01/09/13 |
В прежних версиях я просто компилировал C код с подключением библиотек MatLab’а из любого стандартного компилятора… работает пока.
|
||
|
|||
Andrey_Kireew |
Re: использование DLL в Matlab
|
07/10/15 |
Однако тема здесь об обратном. Саму библиотеку я могу полностью написать на С++, но работать с ней хотелось бы в среде Matlab, так будет проще и намного быстрее исследовать алгоритм. Где то в сети прочитал, что matlab запросто работает с dll и обращаться к ним можно как к обычным m — функциям. Теперь оказывается её сначала нужно загружать, а потом ещё как то запустить содержащуюся в ней функцию.
|
|
|
Geen |
Re: использование DLL в Matlab
|
||
01/09/13 |
Саму библиотеку я могу полностью написать на С++, но работать с ней хотелось бы в среде Matlab, так будет проще и намного быстрее исследовать алгоритм. Именно, Вы пишите критические блоки на C (C++) и вызываете их как функции из MatLab’а без всяких «подгрузок» (просто dll’ка должна содержать mexFunction, через которую и производится вызов) — 14.04.2017, 10:33 — https://www.mathworks.com/help/matlab/c … les-1.html
|
||
|
|||
GAA |
Re: использование DLL в Matlab
|
||
12/07/07 |
Где то в сети прочитал, что matlab запросто работает с dll и обращаться к ним можно как к обычным m — функциям. В старых версиях loadlibrary не было (но в R2013 уже есть). loadlibrary предназначена для преодоления ограничений стандартного способа вызова внешних функций (mex — Matlab EXternal). В простейших случаях в явной загрузке необходимости нет. Для старых версий описание на русском можно найти в книге Мартынов Н.Н., Иванов А.П. “Matlab 5.X. Вычисления, визуализация, программирование” (легко нагуглить электронную версию в сети). [Upd] loadlibrary c 7-ой версии.[/Upd] По теме. Andrey_Kireew , приведите детали. Иначе трудно угадать.
|
||
|
|||
Andrey_Kireew |
Re: использование DLL в Matlab
|
07/10/15 |
Именно, Вы пишите критические блоки на C (C++) и вызываете их как функции из MatLab’а без всяких «подгрузок» (просто dll’ка должна содержать mexFunction, через которую и производится вызов) Да нет, Вы не поняли, я не писал блоки на С++, эта функция написана в matlab в виде m — файла. Там была всего одна функция Q_filt.m, откуда в библиотеке появилось несколько — пока понять не могу. Компиляция вся проводилась в среде матлаб, с помощью Matlab Comoiller. EXE файлы он создаёт запросто, но для .dll требует внешний компилятор. Я указал VC2010, т.к. у меня есть только он. Вообще есть все основания полагать, что при таком подходе всё необходимое для запуска в matlab должно создаваться само. Попробую ещё разок откомпилировать поменяв настройки. За ссылку спасибо — почитаю. Но судя по всему там именно о том что вы говорите, т.е. о внешних файлах, написанных на С++. В перспективе конечно я думаю так и сделать, так как это позволит максимально оптимизировать код. Но пока мне хотелось бы скомпилировать m — функцию непосредственно, чтобы понять какой выигрыш даёт компиляция и на что можно рассчитывать.
|
|
|
Geen |
Re: использование DLL в Matlab
|
||
01/09/13 |
Но пока мне хотелось бы скомпилировать m — функцию непосредственно Перепишите (напишите) на C именно эту функцию — Вы наверняка сумеете написать её более оптимально чем «конвёртер» из m в C. понять какой выигрыш даёт компиляция и на что можно рассчитывать. Выигрыш может быть несколько порядков (зависит и от самой функции и от её использования).
|
||
|
|||
Andrey_Kireew |
Re: использование DLL в Matlab
|
07/10/15 |
Это будет не так быстро, а посмотреть хочется уже сейчас я вот перекомпилировал с другим именем, и она вроде как стала работать Код: >> out =calllib(‘QF’,’mlxQ_filt’,x,3,1001,0.5); если вместо x ввожу число — она возвращает 0 и никаких ошибок, но x — это вектор и возвращать она должна вектор при компиляции выдаётся предупреждение Код: >> warnings может в этом дело?
|
|
|
GAA |
Re: использование DLL в Matlab
|
||
12/07/07 |
1. В старых версиях Matlab можно было создать dll из командного окна. function Res = MyAdd(X, Y) Если «выбран» компилятор, то после ввода в командном окне >> X = [1, 2]; Y = [1, 2]; MyAdd(X, Y) (В прятанье нет необходимости: если при вызове функции в одной директории будет найден и m-файл, и dll, то выполнится функция из dll, в соответствии с написанным в Мартынове и Иванове.) 2. В новых версиях (в том числе R2013 64бит) в описанной вами задаче вместо dll используются бинарные mex-файлы. Компилировать из командного окна см. mex. Тогда вызов функции будет, как и в старых версиях (c mex-dll), просто по имени функции. — Пт 14.04.2017 21:59:10 — Грубо говоря, бинарные mex — [64-битный] аналог mex-dll старых версий.
|
||
|
|||
GAA |
Re: использование DLL в Matlab
|
||
12/07/07 |
На вопрос начального сообщения то есть Matlab её как бы и не видит Под 32-битной Windows расширение исполняемого mex файла — mexw32. Под 64-битной Windows — mexw64. Желательно проверить для конкретной версии, но скорее всего так и есть.
|
||
|
|||
GAA |
Re: использование DLL в Matlab
|
||
12/07/07 |
Компиляция вся проводилась в среде матлаб, с помощью Matlab Comoiller. EXE файлы он создаёт запросто, но для .dll требует внешний компилятор. Я указал VC2010, т.к. у меня есть только он. Это не понятно. Вроде lcc идёт только с 32-битной версией (и это все равно внешний компилятор). С 64-битной он не идёт (и согласно сведениям на сайте MathWorks, и сам только что на одном из компьютеров проверил для R2013b 64bit). Скорее всего mcc просто использовал единственный доступный из совместимых компиляторов (или просто единственный доступный). По поводу использования mcc компилятора. Тут возможно я не прав. И так было в старых версиях.upd — Сб 15.04.2017 10:08:06 — Andrey_Kireew в [url=http://dxdy.ru/post1209378.html#p1209378] писал(а): может в этом дело? Понятно, что работать не будет. (К слову, ни VC 2010 Redistributable, ни VC 2013 Redistributable в список поддерживаемых matlab компиляторов не входит и использовать его у меня не получилось.)
|
||
|
|||
Andrey_Kireew |
Re: использование DLL в Matlab
|
07/10/15 |
Да, я тоже хочу его сделать, но не получается. Вот здесь очень обнадеживающе написано как его сделать из m-файла Код: >> mex -setup проходит нормально. Команда Код: >> mcc Q_filt уже не работает, пишет, что не определён тип целевого приложения. Опытным путём дошел вот до чего Код: >> mcc -win64 -W cpplib:QF -T link:lib -d C:UsersUserDocumentsMATLABQFsrc C:UsersUserDocumentsMATLABCardiстат_тестыQ_filt.m И она работает: в папке C:UsersUserDocumentsMATLABQFsrc появляются dll и всё остальное. Может нужно просто что-то изменить в этой строке, чтобы появлялся mex — файл?
|
|
|
Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы