Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Xcode for Mac中编译和链接Python的C扩展_Python_C_Xcode_Static - Fatal编程技术网

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

在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 我的

我正试图在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
我的最终目标是使用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扩展端。示例项目将很有帮助!