我正在尝试将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(苹果) ]
答案 0 :(得分:4)
我想我找到了答案 - 包括神秘的苹果链接器标志:
-undefined dynamic_lookup -bundle
我能够将它构建起来并且似乎工作正常。如果有人在OS X上有任何关于这些标志或库处理的引用,我会非常感兴趣。现在我看到他们我记得过去曾被同样的事情所困扰 - 但我无法找到任何关于他们实际做什么以及为什么/何时应该需要的文件。