2010-09-27 2 views
2

Я пытаюсь скомпилировать c shared library из matlab. мой код matlab использует много функций обработки изображений. Итак, компиляция идет хорошо, но когда я вызываю dll из своего приложения, я получаю такие сообщения, как «Неопределенная функция или метод« XYZ »для ввода аргументов типа double». Я подтвердил, что мои аргументы в порядке - это не проблема типа. Итак, я попытался добавить функцию% # XYZ в мой файл .m, но это ничего не помогло. Затем я попытался использовать флаг -a в моей команде компиляции:Компиляция разделяемой библиотеки Matlab с помощью инструмента обработки изображений

eval (['mcc -v -N -W lib: cshared -d' clibdir '-T ссылка: lib -a edge' allFiles]);

, но он не компилировать с:

Depfun ошибка: «Не удалось найти край как функцию на пути MATLAB»

Я проверил изображение обработки файлов на моем компьютере (я могу работать все от Matlab без проблем), и мой путь указывает на каталог, который их содержит.

Я также попытался скопировать файлы .m-файлов в ящик в свой рабочий каталог, но это быстро запустило много файлов. и для некоторых функций нет .m - просто .mex - и я не нашел способ включить файл mex в мою .dll.

что мне не хватает?

ответ

2

Вы пробовали использовать папку Image Processing Toolbox с помощью опции -a? Например:

mcc ... -a C:\Program Files\MATLAB\R2009a\toolbox\images\images 

Согласно mcc documentation, все файлы в этой папке, а также все файлы во всех вложенных папках, будут добавлены в архив CTF, и поддерево папка сохраняется в архиве CTF.

Если вы не хотите включать в каждую вложенную папку, вы можете загрузить только файлы в папке, используя подстановочные шаблон:

mcc ... -a C:\Program Files\MATLAB\R2009a\toolbox\images\images\* 

Это может быть необходимо, если есть вложенная папка, которая может иметь функции или скрипты, которые могут быть теневыми в родительской папке. Например, в родительской папке C:\Program Files\MATLAB\R2009a\toolbox\images\images\ есть функция edge.m, и есть ja subfolder that contains Japanese language help files (в Windows), один из которых также называется edge.m. Вы не хотели бы это вложенная папка будет добавлена ​​при компиляции, так что вы можете либо:

  1. Удалить эту вложенный временно, добавить родительскую папку без подстановочных опции (добавить другие вложенные папки вы хотите), то положите эту папку назад.

  2. Добавить родительскую папку с подстановочной опцией (добавить только файлы), а затем отдельно добавить только вложенные папки, которые вы хотите (например, @strel и private) с дополнительным -a команды. ПРИМЕЧАНИЕ. Я не уверен, что добавление вложенных папок по отдельности будет поддерживать поддерево папок родительского каталога в архиве CTF так же, как вариант # 1!

Если вы не хотите включать в себя большой список файлов, которые не могут в конечном итоге используется, вы могли бы вместо того, чтобы попытаться использовать функцию DEPFUN сначала получить список зависимостей для кода MATLAB.Затем из этого списка вы можете найти конкретные функции Image Processing Toolbox, используемые вашим кодом, и включать только те, которые компилируются. Так как вы специально просили, this newsgroup thread упоминает, как включить .mex файл:

mcc ... -a imreconstructmex.mexw32 %# For a 32-bit Windows mex file 


ПРИМЕЧАНИЕ: Существует также MathWorks bug report я наткнулся (который вам нужен логин, чтобы увидеть), что упоминает проблему компиляции приложений, использующих некоторые функции Image Processing Toolbox для Windows в R2009b. Существует обходной путь, указанный в приведенной выше ссылке. Эта ошибка исправлена ​​с R2010a.

+0

спасибо за ответ ... я думаю, что теперь я ближе. однако теперь я получаю ошибку времени выполнения: «попытайтесь выполнить скрипт как функцию: c: \ ... \ edge.m». Я предполагаю, что край затенен (он имеет .m и .mex). Есть ли способ сказать mcc правильно разрешить скрытые функции? Я предполагаю, что это не единственная проблема, которая будет иметь эту проблему. – mike

+0

Кстати, я использую 2008B. – mike

+0

@mike: В моей версии MATLAB (R2009a) я вижу функцию «edge.m» в папке «C: \ Program Files \ MATLAB \ R2009a \ toolbox \ images \ images». Есть три папки: «@strel», «ja» и «private». Я не нашел файл .mex для «edge». Единственной папкой, в которой я нашел другой файл с именем «edge» in, является папка «ja», в которой есть еще один «edge.m», который, как представляется, является только комментариями. В ближайшее время я обновлю свой ответ на этот вопрос. – gnovice

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