2
votes

Problèmes avec une fonction mex mxGetDoubles () lors de la compilation

Chaque fois que j'essaye de compiler ma très simple fonction de test mex, j'obtiens une erreur

"référence non définie à« mxGetDoubles »
collect2.exe: erreur: ld a renvoyé 1 statut de sortie

J'utilise Matlab R2019a, mingw-w64 6.3.0. L'exemple de fichier c qu'ils donnent (explore.c) se compile très bien et utilise également mxGetDoubles () .

J'ai essayé d'utiliser mxGetPr () et même s'ils disent qu'ils ne le recommandent pas et que cela ne devrait pas fonctionner après matlab R2018a dans la documentation, cela fonctionne juste très bien.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "mex.h"
#include "matrix.h"



void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]){
    mxDouble *vertices;


    vertices = mxGetDoubles(prhs[1]);//mxGetPr(prhs[1]);

}


4 commentaires

Le message ne semble pas provenir du compilateur lui-même mais soit de l'éditeur de liens (ce qui signifie: une bibliothèque est manquante) ou du chargeur (ce qui signifie: une dll est manquante).


@PaulOgilvie C'est une erreur matlab lorsque j'appelle `` mex fileName.c '', mais encore une fois, la partie étrange est que la fonction plus ancienne et le fichier exemple c qui utilise la même fonction fonctionnent tous les deux.


Cela semble être lié à 32/64 bits, mais je n'ai pas trouvé de solution.


@AnderBiguri Je viens de l'essayer en utilisant "mex -R2018a fileName.c" et cela a été compilé sans erreur. Je suis juste en train de le tester maintenant pour voir si cela fonctionne également. Cela pourrait avoir à voir avec l'API entrelacée matlab


3 Réponses :


2
votes

Il s'est avéré que le correctif était assez simple, au lieu d'appeler mex fileName.c , j'ai dû utiliser mex -R2018a fileName.c .

Mais cela ne répond pas à la raison pour laquelle mex explore.c fonctionne même s'il utilise la même fonction, donc si quelqu'un sait pourquoi, je serais vraiment intéressé. Je suppose que cela a quelque chose à voir avec l'API complexe entrelacée, mais pourrait être n'importe quoi.


0 commentaires

3
votes

Parce que dans explore.c il y a le test, ligne 686:

 #if MX_HAS_INTERLEAVED_COMPLEX


0 commentaires

2
votes

Pour clarifier les réponses (en supposant que vous n'utilisiez que des variables doubles réelles):

  1. Soit utiliser

    static void mdlUpdate(SimStruct *S, int_T tid)
    {
        const real_T   *u    = (const real_T*) ssGetInputPortSignal(S,0);
        real_T         *x    = ssGetRealDiscStates(S);
        const mxArray  *p_mx = (const mxArray *) ssGetSFcnParam(S, 0);
    
    #if MX_HAS_INTERLEAVED_COMPLEX
        const mxDouble *p    = mxGetDoubles(p_mx);
    #else
        const double   *p    = mxGetPr(p_mx); // pointer to real part
    #endif
    
       //...
    
    }
    

    avec la commande

    mex my_system_function.c
    

    (comme vous l'avez proposé)

  2. Ou vous pouvez également utiliser

    #if MX_HAS_INTERLEAVED_COMPLEX
        vertices = mxGetDoubles(prhs[1]);
    #else
        vertices = mxGetPr(prhs[1]); // pointer to real part
    #endif
    

    avec la commande

    mex -R2018a my_system_function.c
    

    (comme mpre l'indique - voir le code dans "C: \ Program Files \ MATLAB \ R2019b \ extern \ examples \ mex \ explore.c").

Dans mon cas, je l'ai utilisé pour récupérer les paramètres de la fonction dans la fonction de mise à jour:

vertices = mxGetDoubles(prhs[1]);


0 commentaires