swig转换标题中的枚举

时间:2018-08-20 21:30:38

标签: python c swig

使用SWIG时,我尝试从python导入c头文件。(我是SWIG的初学者)。头文件中只有MACRO和枚举。宏可以成功转换,但枚举有误。

例如,test.h:

typedef enum {
  VAL0,
  VAL1,
  VAL2,
  VAL3
}VALS;

然后

swig -Wall -python -module test test.h

我成功地得到了一个py函数和一个test_wrap.c文件。出现奇怪的代码:

SWIG_Python_SetConstant(d, "VAL0",SWIG_From_int((int)(VAL0)));
SWIG_Python_SetConstant(d, "VAL1",SWIG_From_int((int)(VAL1)));
SWIG_Python_SetConstant(d, "VAL2",SWIG_From_int((int)(VAL2)));
SWIG_Python_SetConstant(d, "VAL3",SWIG_From_int((int)(VAL3)));

因此未定义VAL0-3。然后,使用以下命令进行编译时,出现未声明的错误VAL0 / VAL1 / VAL2 / VAL3:

gcc -c -fpic test_wrap.c -I/usr/lib/python-2.7.5/include/python2.7

我认为SWIG注意到它是一个枚举,因为我发现了以下代码:

 static swig_type_info _swigt__p_VALS = {"_p_VALS", "enum VALS *|VALS *", 0, 0, (void*)0, 0};

所以我的问题是为什么没有定义它们?他们不应该指定为0、1、2、3吗?我该怎么办?

我没有找到关于stackoverflow的类似问题。请告诉我它是否重复其他问题。

1 个答案:

答案 0 :(得分:0)

SWIG documentation on enums说:

  

对于枚举,至关重要的是将原始枚举定义包含在接口文件中的某个位置(在头文件中或在%{%}块中)。 SWIG仅将枚举转换为将常量添加到脚本语言所需的代码。它需要原始的枚举声明,以便获得C编译器分配的正确的枚举值。

由于您使用原始头文件和-module参数调用了SWIG,因此尚未遵守。

幸运的是,解决方法很简单,添加以下test.i文件:

%module test

%{
#include "test.h"
%}

%include "test.h"

然后通过以下方式致电SWIG

swig -Wall -python test.i

足以使它按预期进行编译和运行。基本上,所有这些操作都是将#include "test.h"添加到SWIG生成的test_wrap.c文件中。