2009-11-09 16 views
3

J'essaie d'intégrer Python dans une fonction MATLAB mex sur OS X. J'ai vu des références que cela peut être fait (par exemple here) mais je ne trouve aucun système d'exploitation X informations spécifiques. Jusqu'à présent, je peux construire avec succès un Python embarqué (donc mes drapeaux éditeur de liens doit être OK) et je peux aussi construire des exemples de fichiers Mex sans aucun problème et avec les options par défaut:intégrer python dans matlab fichier mex sur os x

jm-g26b101:mex robince$ cat pytestnomex.c 
#include <Python/Python.h> 

int main() { 
    Py_Initialize(); 
    PyRun_SimpleString("print 'hello'"); 
    Py_Finalize(); 
    return 0; 
} 
jm-g26b101:mex robince$ gcc -arch i386 pytestnomex.c -I/Library/Frameworks/Python.framework/Versions/2.5/include/python2.5 -L/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/config -ldl -lpython2.5 
jm-g26b101:mex robince$ ./a.out 
hello 

Mais lorsque je tente de construire une MEX fichier qui embarque Python Je rencontre un problème avec le symbole principal non défini. Voici ma fonction MEX:

#include <Python.h> 
#include <mex.h> 

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray*prhs[]) 
{ 
    mexPrintf("hello1\n"); 
    Py_Initialize(); 
    PyRun_SimpleString("print 'hello from python'"); 
    Py_Finalize(); 
} 

Voici les étapes de compilation MEX:

jm-g26b101:mex robince$ gcc -c -I/Applications/MATLAB_R2009a.app/extern/include -I/Applications/MATLAB_R2009a.app/simulink/include -DMATLAB_MEX_FILE -arch i386 -I/Library/Frameworks/Python.framework/Versions/2.5/include/python2.5 -DMX_COMPAT_32 -O2 -DNDEBUG "pytest.c" 
jm-g26b101:mex robince$ gcc -O -arch i386 -L/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/config -ldl -lpython2.5 -o "pytest.mexmaci" pytest.o -L/Applications/MATLAB_R2009a.app/bin/maci -lmx -lmex -lmat -lstdc++ 
Undefined symbols: 
    "_main", referenced from: 
     start in crt1.10.6.o 
ld: symbol(s) not found 
collect2: ld returned 1 exit status 

J'ai essayé de jouer avec les paramètres arc (j'ai ajouté -arch i386 pour essayer de garder tout 32bit - J'utilise le python.org 32 bit 2.5 build), et l'ordre des drapeaux de l'éditeur de liens, mais je n'ai pas réussi à aller n'importe où. Je ne trouve pas beaucoup en ligne non plus. Est-ce que quelqu'un a des idées sur la façon dont je peux construire ça?

[EDIT: devrait probablement ajouter que je suis sur OS X 10.6.1 avec MATLAB 7.8 (r2009a), Python 2.5.4 (python.org) - J'ai essayé à la fois gcc-4.0 et gcc-4.2 (apple)]

Répondre

4

Je pense avoir trouvé la réponse - en incluant les drapeaux mystérieux éditeur de liens de pomme:

-undefined dynamic_lookup -bundle 

j'ai pu faire construire et il semble fonctionner correctement. Je serais très intéressé si quelqu'un a des références à propos de ces drapeaux ou de la gestion de la bibliothèque sur OS X en général. Maintenant, je les vois, je me souviens d'avoir été mordu par la même chose dans le passé - mais je suis incapable de trouver de la documentation sur ce qu'ils font réellement et pourquoi/quand ils devraient être nécessaires.

+1

Voir 'man ld'. Les offres groupées sont expliquées ici: http://developer.apple.com/mac/library/documentation/CoreFoundation/Conceptual/CFBundles/Introduction/Introduction.html –