在Xcode for Mac中编译和链接Python的C扩展

我正在尝试在Mac中编译一个简单的C扩展以与Python一起使用,并且在命令行中一切运行良好。 有效的代码和gcc命令如下所示。 现在我正在尝试在Xcode 4.5(Mac OS10.8)中构建相同的扩展,并且我尝试了dylib或静态库的几个目标设置,但是我总是得到一个无法用Python加载的文件,显示错误:

./myModule.so: unknown file type, first eight bytes: 0x21 0x3C 0x61 0x72 0x63 0x68 0x3E 0x0A 

我的最终目标是在XCode中创建一个工作区,其中包含C / C ++扩展的源代码,并具有在Xcode中调用它的python脚本。 所以,如果我需要调试C / C ++扩展,我有XCode调试function。 我知道XCode不会调试到Python脚本,但它可以运行它,对吗?

 gcc -shared -arch i386 -arch x86_64 -L/usr/lib/python2.7 -framework python -I/usr/include/python2.7 -o myModule.so myModule.c -v #include  /* * Function to be called from Python */ static PyObject* py_myFunction(PyObject* self, PyObject* args) { char *s = "Hello from C!"; return Py_BuildValue("s", s); } /* * Another function to be called from Python */ static PyObject* py_myOtherFunction(PyObject* self, PyObject* args) { double x, y; PyArg_ParseTuple(args, "dd", &x, &y); return Py_BuildValue("d", x*y); } /* * Bind Python function names to our C functions */ static PyMethodDef myModule_methods[] = { {"myFunction", py_myFunction, METH_VARARGS}, {"myOtherFunction", py_myOtherFunction, METH_VARARGS}, {NULL, NULL} }; /* * Python calls this to let us initialize our module */ void initmyModule() { (void) Py_InitModule("myModule", myModule_methods); } 

这家伙似乎有同样的问题 。

我已经找到了问题所在。 即使我更改了xcode中的设置以指定输出类型“dynamic library”或“bundle”,xcode也忽略了该设置。 启动一个新的BSD动态库项目解决了我所看到的问题。 谢谢您的帮助!

我使用setuptools,virtualenv,unittest和GDB作为调试器,在XCode 4.6中成功调试了经过unit testing的C扩展。

我使用virtualenvwrapper为项目创建virtualenv,然后将〜/ .virtualenvs / module_name / bin / python设置为要调试的可执行文件。

在Run配置中传递给virtualenv python解释器的单个参数是test.py的路径。

然后我设置GDB而不是None作为调试器自动启动它。

最后一步是在测试目标的外部构建工具配置窗格上将“setup.py install”作为构建工具(〜/ .virtualenvs / module_name / bin / python)的参数传递。 virtualenv为您提供了一种相当简单的方法,可以将C扩展的共享对象安装到测试脚本python interpreter的库路径中,而无需将其实际安装到主机的全局站点包中。

通过这种设置,我可以从python脚本(最终目标)调用扩展代码,并仍然使用XCode的GUI调试支持调试C代码。

如果我没有清楚地描述这个,请告诉我,我将分享一个示例项目。