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

3 投票
1 回答
3748 浏览
提问于 2025-04-15 15:49

我正在尝试在OS X上将Python嵌入到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(苹果自带的)]

1 个回答

4

我想我找到了答案——通过加入那些神秘的苹果链接器标志:

-undefined dynamic_lookup -bundle

我成功地编译了它,似乎运行得还不错。如果有人能提供关于这些标志或在OS X上处理库的一些资料,我会非常感兴趣。现在看到这些标志,我想起以前也遇到过类似的问题——但我找不到关于它们到底做什么、为什么/什么时候需要它们的任何文档。

撰写回答