在OS X上将Python嵌入Matlab MEX文件

3
我试图将Python嵌入到OS X上的MATLAB mex函数中。我看到过可以这样做的参考资料(例如这里),但我找不到任何针对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

但是,当我试图构建嵌入Python的mex文件时,我遇到了一个未定义符号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位 - 我正在使用python.org 32位2.5版本),以及链接器标志的顺序,但一直无法进展。在线上没有找到太多信息。有人有什么想法可以帮我解决构建问题吗?
[编辑:可能需要补充说明,我使用的是OS X 10.6.1和MATLAB 7.8(r2009a),Python 2.5.4(python.org) - 我尝试过使用gcc-4.0和gcc-4.2(apple)]
1个回答

4
我想我找到了答案——通过包含神秘的苹果链接器标志:
-undefined dynamic_lookup -bundle

我已经成功构建了它,看起来运行良好。如果有人对这些标志或在OS X上处理库有任何参考资料,我会非常感兴趣。现在我看到它们,我记得过去也曾被同样的问题困扰 - 但我无法找到任何关于它们实际作用以及何时/为什么需要它们的文档。


1
请参阅 man ld。有关 Bundles 的说明,请访问此处:http://developer.apple.com/mac/library/documentation/CoreFoundation/Conceptual/CFBundles/Introduction/Introduction.html - Ned Deily

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接