встроить python в файл matlab mex на os x

Я пытаюсь внедрить Python в mex-функцию MATLAB в OS X. Я видел ссылки на то, что это можно сделать (например, здесь), но я не могу найти никакой конкретной информации для OS X. На данный момент я могу успешно собрать встроенный Python (поэтому мои флаги компоновщика должны быть в порядке), а также я могу без проблем собрать примеры mex-файлов и с параметрами по умолчанию:

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

Но когда я пытаюсь создать mex-файл, который встраивает Python, я сталкиваюсь с проблемой с неопределенным символом main. Вот моя функция 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();
}

Вот шаги компиляции 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

Я пробовал играть с настройками арки (я добавил -arch i386, чтобы попытаться сохранить все 32-битное - я использую 32-битную сборку python.org 2.5) и порядок флагов компоновщика, но не смог добраться куда угодно. В сети тоже многого не нашел. Есть ли у кого-нибудь идеи о том, как я могу заставить это построить?

[EDIT: вероятно, следует добавить, что я на OS X 10.6.1 с MATLAB 7.8 (r2009a), Python 2.5.4 (python.org) - я пробовал как gcc-4.0, так и gcc-4.2 (apple)]


person robince    schedule 09.11.2009    source источник


Ответы (1)


Я думаю, что нашел ответ - включив таинственные флаги компоновщика Apple:

-undefined dynamic_lookup -bundle

Я смог его построить, и, похоже, он работает нормально. Мне было бы очень интересно, если бы у кого-нибудь были ссылки на эти флаги или обработку библиотек в OS X в целом. Теперь, когда я их вижу, я помню, как меня укусила одна и та же вещь в прошлом, но я не могу найти никакой документации о том, что они на самом деле делают и почему/когда они должны быть нужны.

person robince    schedule 09.11.2009
comment
См. man ld. Описание пакетов приведено здесь: developer.apple.com /mac/library/documentation/CoreFoundation/ - person Ned Deily; 09.11.2009