在Xcode for Mac中编译和链接Python的C扩展
我正试图在Mac中编译一个简单的C扩展,以便与Python一起使用,并且所有这些都在命令行中运行良好。下面给出了有效的代码和gcc命令。 现在我尝试在Xcode 4.5(Mac OS10.8)中构建相同的扩展,我尝试了动态库或静态库的几种目标设置,但我总是得到一个无法在Python中加载的文件,显示错误:在Xcode for Mac中编译和链接Python的C扩展,python,c,xcode,static,Python,C,Xcode,Static,我正试图在Mac中编译一个简单的C扩展,以便与Python一起使用,并且所有这些都在命令行中运行良好。下面给出了有效的代码和gcc命令。 现在我尝试在Xcode 4.5(Mac OS10.8)中构建相同的扩展,我尝试了动态库或静态库的几种目标设置,但我总是得到一个无法在Python中加载的文件,显示错误: ./myModule.so: unknown file type, first eight bytes: 0x21 0x3C 0x61 0x72 0x63 0x68 0x3E 0x0A 我的
./myModule.so: unknown file type, first eight bytes: 0x21 0x3C 0x61 0x72 0x63 0x68 0x3E 0x0A
我的最终目标是使用C/C++扩展的源代码在XCode中创建一个工作区,并使用python脚本在XCode中调用它。因此,如果我需要调试C/C++扩展,我有XCode调试功能。我知道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 <Python.h>
/*
* 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);
}
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
#包括
/*
*要从Python调用的函数
*/
静态PyObject*py_myFunction(PyObject*self,PyObject*args)
{
char*s=“来自C的你好!”;
返回Py_BuildValue(“s”,s);
}
/*
*要从Python调用的另一个函数
*/
静态PyObject*py_myOtherFunction(PyObject*self,PyObject*args)
{
双x,y;
PyArg_语法元组(args,dd,&x,&y);
返回Py_构建值(“d”,x*y);
}
/*
*将Python函数名绑定到我们的C函数
*/
静态PyMethodDef myModule_方法[]={
{“myFunction”,py_myFunction,METH_VARARGS},
{“myOtherFunction”,py_myOtherFunction,METH_VARARGS},
{NULL,NULL}
};
/*
*Python调用这个函数,让我们初始化我们的模块
*/
void initmyModule()
{
(void)Py_InitModule(“myModule”,myModule_方法);
}
我已经解决了这个问题。即使我更改了xcode中的设置以指定输出类型“dynamic library”或“bundle”,xcode还是忽略了该设置。启动一个新的BSD动态库项目解决了我所看到的问题。谢谢你的帮助
我使用setuptools、virtualenv、unittest和GDB作为调试器成功地调试了XCode 4.6中的单元测试C扩展 我使用virtualenvwrapper为项目创建一个virtualenv,然后将~/.virtualenvs/module\u name/bin/python设置为要调试的可执行文件 要在运行配置中传递给virtualenv python解释器的单个参数是test.py的路径 然后我将GDB设置为自动启动它的调试器,而不是None 最后一步是将“setup.py install”作为参数传递给测试目标的外部构建工具配置窗格上的构建工具(~/.virtualenvs/module\u name/bin/python)。virtualenv为您提供了一种相当简单的方法,可以将C扩展的共享对象安装到测试脚本python解释器的库路径中,而无需将其实际安装到主机的全局站点包中 通过这种设置,我可以从python脚本调用扩展代码(最终目标),并且仍然可以使用XCode的GUI调试支持调试C代码
如果我没有清楚地描述这一点,请让我知道,我将分享一个示例项目。前8个字节解码为“!\n”。这对您有什么意义吗?作为奖励,我可以在IntelliJ/IDEA(PyCharm)中调试测试的Python端,同时将Xcode中的GDB调试器附加到测试运行程序进程中,以同时调试Xcode中的C扩展端。示例项目将很有帮助!