Python C API:T_INT 未在此范围内声明

Posted

技术标签:

【中文标题】Python C API:T_INT 未在此范围内声明【英文标题】:Python C API: T_INT was not declared in this scope 【发布时间】:2019-04-25 06:01:25 【问题描述】:

我正在关注the official tutorial of Python API,在 C++ 中为 Python 创建一个简单的扩展类型。但我无法成功编译我的代码。因为当我在我的代码中使用T_INT 时,我收到了一个错误消息'T_INT' was not declared in this scope。我忘了什么吗?我在教程中找不到答案。

这是我的 C++ 代码:

#define PY_SSIZE_T_CLEAN
#include <python3.6/Python.h>
#include <stddef.h>

typedef struct 
    PyObject_HEAD
    int num;
 MyObject;

static PyMemberDef MyMembers[] =  
     "num", T_INT, offsetof(MyObject, num), 0, NULL ,
     NULL 
;

static PyTypeObject MyType = [] 
    PyTypeObject ret =  
        PyVarObject_HEAD_INIT(NULL, 0)
    ;  
    ret.tp_name = "cpp.My";
    ret.tp_doc = NULL;
    ret.tp_basicsize = sizeof(MyObject);
    ret.tp_itemsize = 0;
    ret.tp_flags = Py_TPFLAGS_DEFAULT;
    ret.tp_new = PyType_GenericNew;
    ret.tp_members = MyMembers;
    return ret;
();

static PyModuleDef moddef = [] 
    PyModuleDef ret =  
        PyModuleDef_HEAD_INIT
    ;  
    ret.m_name = "cpp";
    ret.m_doc = NULL;
    ret.m_size = -1; 
    return ret;
();

PyMODINIT_FUNC
PyInit_cpp(void)

    PyObject *mod;
    if (PyType_Ready(&MyType) < 0)
        return NULL;
    mod = PyModule_Create(&moddef);
    if (mod == NULL)
        return NULL;
    Py_INCREF(&MyType);
    PyModule_AddObject(mod, "My", (PyObject *)&MyType);
    return mod;

我使用以下命令编译:

g++ -std=c++11 -shared -fPIC -o cpp.so tt.cpp

我得到的第一个错误是:

tt.cpp:10:11: error: 'T_INT' was not declared in this scope

我的g++ 版本是7.3.0

【问题讨论】:

【参考方案1】:

是的,你忘记了一些东西,特别是教程中包含的两个中的第二个:

#include "structmember.h"

那是提供T_INT 的那个。 (您可能在 python3.6/structmember.h 中拥有它,查看您现有的导入。)

【讨论】:

谢谢。这解决了我的问题。我试过#include "structmember.h",但没有找到。但是我的问题我忘了#include "python3.6/structmember.h"【参考方案2】:

我认为您忘记在代码中添加另一个包含语句。

你可以尝试包含

#include "structmember.h"

在您的代码中(也许您需要搜索标题),因为您包含 #include &lt;python3.6/Python.h&gt; 在您的代码中,您可能必须这样做 #include python3.6/structmember.h,对于同样的问题here,还有另一个答案。

【讨论】:

谢谢。这解决了我的问题。我试过#include "structmember.h",但没有找到。但是我的问题我忘了#include "python3.6/structmember.h" 如果你提到了我在那里也提到的完整答案。 是的,我注意到了。 :)

以上是关于Python C API:T_INT 未在此范围内声明的主要内容,如果未能解决你的问题,请参考以下文章

带有ndk平台错误帮助'_IOR'的c ++未在此范围内声明

Python3 mlpy 安装错误 - 'Py_InitModule3' 未在此范围内声明

C++ 错误:未在此范围内声明类/对象

QueryFullProcessImageName 未在此范围内声明

C++ 错误:“QueryFullProcessImageNameA”未在此范围内声明

使用-std = c ++ 11后,'stoi'未在此范围内声明