2010-09-27 9 views
2

Je suis en train de compiler c une bibliothèque partagée à partir de matlab. mon code matlab utilise beaucoup de fonctionnalités de traitement d'image. Donc, la compilation se passe bien, mais quand j'appelle la DLL de mon application, je reçois des messages comme, "Fonction non définie ou méthode 'XYZ' pour les arguments d'entrée de type double". J'ai vérifié que mes arguments sont corrects - ce n'est pas un problème de type. Donc, j'ai essayé d'ajouter% # fonction XYZ à mon fichier .m, mais cela n'a rien arrangé. Ensuite, j'ai essayé d'utiliser l'indicateur -a dans ma commande de compilation:Compilation de la bibliothèque partagée Matlab avec la boîte à outils de traitement d'image

eval (['mcc -v -N -W lib: cshared -d' clibdir '-T lien: lib -a bord' allFiles]);

mais il ne parvient pas à compiler avec:

erreur Depfun: « Impossible de trouver le bord en fonction sur le chemin Matlab »

J'ai vérifié les fichiers de traitement de l'image sont sur mon ordinateur (je peux courir tout depuis matlab sans problème), et mon chemin pointe vers le répertoire qui les contient.

J'ai également essayé de copier les fichiers de la boîte à outils .m dans mon répertoire de travail, mais cela gonfle rapidement dans beaucoup de fichiers. et, pour certaines fonctions, il n'y a pas de .m - juste un .mex - et je n'ai pas trouvé un moyen d'inclure un fichier mex dans mon fichier .dll.

Que manque-t-il?

Répondre

2

Avez-vous essayé d'inclure le dossier Image Processing Toolbox à l'aide de l'option -a? Par exemple:

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

Selon le mcc documentation, tous les fichiers dans ce dossier, ainsi que tous les fichiers dans tous les sous-dossiers sont ajoutés aux archives du FCT, et la sous-arborescence du dossier est conservé dans les archives du FCT.

Si vous ne voulez pas inclure tous les sous-dossiers, vous pouvez charger uniquement les fichiers dans un dossier en utilisant un modèle générique:

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

Cela peut être nécessaire s'il y a un sous-dossier qui peut avoir des fonctions ou les scripts qui pourraient les ombrer dans le dossier parent. Par exemple, il existe une fonction edge.m dans le dossier parent C:\Program Files\MATLAB\R2009a\toolbox\images\images\, et il existe un ja subfolder that contains Japanese language help files (sous Windows), dont l'un est également appelé edge.m. Vous ne voudriez pas que ce sous-dossier à ajouter lors de la compilation, vous pouvez soit:

  1. Retirez le sous-répertoire temporaire, ajoutez le dossier parent sans l'option générique (pour ajouter les autres sous-dossiers que vous ne voulez), puis remets ce dossier.

  2. Ajouter le dossier parent avec l'option générique (pour ajouter uniquement les fichiers), puis ajouter séparément que les sous-dossiers que vous voulez (comme @strel et private) avec une commande -a supplémentaire. NOTE: Je ne suis pas certain que l'ajout séparé de sous-dossiers maintiendra la sous-arborescence de dossiers du répertoire parent dans l'archive CTF de la même manière que l'option # 1!

Si vous ne voulez pas inclure une grande liste des fichiers qui ne peuvent pas finir par être utilisé, vous pourriez plutôt essayer d'utiliser la fonction DEPFUN d'abord obtenir une liste des dépendances pour votre code Matlab.Ensuite, à partir de cette liste, vous pouvez trouver les fonctions spécifiques d'Image Processing Toolbox que votre code utilise et inclure uniquement celles qui sont utilisées lors de la compilation. Depuis que vous avez demandé spécifiquement, this newsgroup thread mentionne comment inclure un fichier .mex:

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


NOTE: Il y a aussi un MathWorks bug report je suis tombé (que vous avez besoin d'une connexion pour voir) qui mentionne un problème de compilation applications utilisant certaines fonctions Image Processing Toolbox sur Windows dans R2009b. Il existe une solution de contournement au lien ci-dessus. Ce bug est corrigé à partir de R2010a.

+0

merci pour la réponse ... je pense que je suis plus proche maintenant. cependant, maintenant je reçois une erreur d'exécution, "essayez d'exécuter le script en tant que fonction: c: \ ... \ edge.m". Je devine parce que le bord est ombragé (il a un .m et un .mex). Y at-il un moyen de dire à mcc de résoudre correctement les fonctions ombrées? Je devine que Edge n'est pas le seul qui va avoir ce problème. – mike

+0

btw, j'utilise 2008B. – mike

+0

@mike: Dans ma version de MATLAB (R2009a), je peux voir une fonction "edge.m" dans le dossier "C: \ Program Files \ MATLAB \ R2009a \ boîte à outils \ images \ images". Il y a aussi trois dossiers: "@strel", "ja" et "private". Je n'ai pas trouvé de fichier .mex pour "edge". Le seul dossier dans lequel je trouve un autre fichier nommé "edge" est le dossier "ja", qui a un autre "edge.m" qui semble n'être rien d'autre que des commentaires. Je vais mettre à jour ma réponse rapidement avec un moyen potentiel de contourner cela. – gnovice

Questions connexes