SWIG 包装器未声明(在此函数中首次使用)

Posted

技术标签:

【中文标题】SWIG 包装器未声明(在此函数中首次使用)【英文标题】:SWIG wrapper undeclared (first use in this function) 【发布时间】:2019-12-07 12:32:57 【问题描述】:

我正在尝试为 C++ 代码创建一个包装器,以便在 python 项目中使用它。 代码取自here(主要是mtree.h)。

我正在使用 swig 通过以下方式生成界面: swig -python -module mtree mtree.h

然后当我尝试gcc -c -fpic mtree_wrap.c 时,我收到以下错误:

user@ubuntu:~/git/M-Tree/cpp2python(master)$ gcc -c -fpic mtree_wrap.c
mtree_wrap.c: In function ‘Swig_var_mt_set’:
mtree_wrap.c:3029:7: error: ‘mt’ undeclared (first use in this function)
       mt = *((namespace *)(argp));
       ^~
mtree_wrap.c:3029:7: note: each undeclared identifier is reported only once for each function it appears in
mtree_wrap.c:3029:15: error: ‘namespace’ undeclared (first use in this function); did you mean ‘isspace’?
       mt = *((namespace *)(argp));
               ^~~~~~~~~
               isspace
mtree_wrap.c:3029:26: error: expected expression before ‘)’ token
       mt = *((namespace *)(argp));
                          ^
mtree_wrap.c: In function ‘Swig_var_mt_get’:
mtree_wrap.c:3041:47: error: ‘mt’ undeclared (first use in this function)
   pyobj = SWIG_NewPointerObj(SWIG_as_voidptr(&mt), SWIGTYPE_p_namespace,  0 );
                                               ^
mtree_wrap.c:1163:89: note: in definition of macro ‘SWIG_NewPointerObj’
 ointerObj(ptr, type, flags)            SWIG_Python_NewPointerObj(NULL, ptr, type, flags)
                                                                        ^~~
mtree_wrap.c:3041:30: note: in expansion of macro ‘SWIG_as_voidptr’
   pyobj = SWIG_NewPointerObj(SWIG_as_voidptr(&mt), SWIGTYPE_p_namespace,  0 );
                              ^~~~~~~~~~~~~~~

这是发生错误的mtree.c

SWIGINTERN int Swig_var_mt_set(PyObject *_val) 
  
    void *argp = 0;
    int res = SWIG_ConvertPtr(_val, &argp, SWIGTYPE_p_namespace,  0 );
    if (!SWIG_IsOK(res)) 
      SWIG_exception_fail(SWIG_ArgError(res), "in variable '""mt""' of type '""namespace""'");
    
    if (!argp) 
      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in variable '""mt""' of type '""namespace""'");
     else 
      mt = *((namespace *)(argp));
    
  
  return 0;
fail:
  return 1;



SWIGINTERN PyObject *Swig_var_mt_get(void) 
  PyObject *pyobj = 0;

  pyobj = SWIG_NewPointerObj(SWIG_as_voidptr(&mt), SWIGTYPE_p_namespace,  0 );
  return pyobj;


有什么解决办法吗?

【问题讨论】:

【参考方案1】:

首先使用swig的c++模式,用-c++开关。但这对你没有任何好处。 Swig 无法为模板类创建包装器。您需要创建正确的 swg 文件并声明应该在 python 中使用的模板规范。像这样:

%module strmtree;

//generate good wrapper for std::string -> python string
%include "stdstring.i"

%
//include actualy header in wrapper
#include "mtree.h"
%

//generate wrapper for class in this file,
//but since the class is template, it won't generate anything on it's own.
%include "mtree.h"

//declare template specialization for string and call it StrMTree.
//ideally you'll get StrMTree class in python
%template(StrMTree) mt::mtree<std::string>;

不知道 mtree 模板参数通常应该使用什么类型。如果你想要 python 对象的 mtree,那么它会复杂得多......你可能需要 C++ 中的某种接口,用这个接口专门化 mtree,然后在 python 中实现接口。

【讨论】:

以上是关于SWIG 包装器未声明(在此函数中首次使用)的主要内容,如果未能解决你的问题,请参考以下文章

Iphone 开发中的错误 - 未声明的问候语(在此函数中首次使用)

CLONE_VM 未声明(在此函数中首次使用)

iPhone HelpViewController 未声明(本函数中首次使用)

使用 SWIG 为 Python 包装 C++。 “向量”未声明

swig-php 包装器使用指针,c 代码是一个数组

opencv中未声明的'true'(首次在此函数中使用)[重复]