Pregunta

Estoy tratando de incrustar Python en una función MATLAB mex en OS X. He visto referencias que esto se puede hacer (por ejemplo, aquí ) pero no puedo encontrar ninguna OS X información específica. Hasta el momento puedo construir con éxito un Python incrustado (por lo que mis banderas enlazador debe estar bien) y yo también pueden crear archivos de ejemplo mex sin ningún problema y con las opciones por defecto:

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

Pero cuando intento de construir un archivo mex que incorpora Python me encuentro con un problema con el símbolo indefinido principal. Aquí está mi función 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();
}

Estos son los pasos de compilación 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

He intentado jugar con la configuración de arco (añadí i386 -arch a tratar de mantener todo lo 32bit - Estoy utilizando el python.org 32 bits 2.5 build), y el orden de las banderas de engarce, pero Haven' t sido capaz de llegar a cualquier parte. No se puede encontrar tanto en línea tampoco. ¿Alguien tiene alguna idea de cómo puedo conseguir esto para construir?

[EDIT: probablemente debería añadir que estoy en OS X 10.6.1 con MATLAB 7.8 (R2009a), Python 2.5.4 (python.org) - He intentado tanto gcc-4.0 y gcc-4.2 (manzana) ]

¿Fue útil?

Solución

Creo que he encontrado la respuesta - mediante la inclusión de las banderas de engarce manzana misteriosos:

-undefined dynamic_lookup -bundle

Yo era capaz de conseguir que construyó y parece que funciona bien. Estaría muy interesado si alguien tiene referencias sobre estas banderas o el manejo de la biblioteca en OS X en general. Ahora los veo me acuerdo de haber sido picado por lo mismo en el pasado - sin embargo, yo soy incapaz de encontrar ninguna documentación sobre lo que realmente hacen y por qué / cuando deberían ser necesarios

.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top