将python嵌入到os x上的matlab mex文件中

Posted

技术标签:

【中文标题】将python嵌入到os x上的matlab mex文件中【英文标题】:embed python in matlab mex file on os x 【发布时间】:2009-11-09 12:12:38 【问题描述】:

我正在尝试将 Python 嵌入到 OS X 上的 MATLAB mex 函数中。我已经看到可以做到这一点的参考资料(例如 here),但我找不到任何 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 设置(我添加了 -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】:

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

-undefined dynamic_lookup -bundle

我能够构建它并且它似乎工作正常。如果有人对 OS X 上的这些标志或库处理有任何参考,我会非常感兴趣。现在我看到他们,我记得过去曾被同样的事情咬伤 - 但我无法找到任何关于他们实际做什么以及为什么/何时需要它们的文档。

【讨论】:

man ld。捆绑包在这里解释:developer.apple.com/mac/library/documentation/CoreFoundation/…

以上是关于将python嵌入到os x上的matlab mex文件中的主要内容,如果未能解决你的问题,请参考以下文章

通过蓝牙将 Android 应用程序连接到 Mac OS X 上的 Python 脚本

添加到python路径mac os x

在 MATLAB 中嵌入 Python

RE 错误:Mac OS X 上的非法字节序列

Linux 上的 MATLAB MEX 文件无法在 libpython.2.7.so 中找到符号

OS X 上的 ViennaCL:无法将数据复制到 GPU