使用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的类似问题。请告诉我它是否重复其他问题。
答案 0 :(得分:0)
对于枚举,至关重要的是将原始枚举定义包含在接口文件中的某个位置(在头文件中或在%{%}块中)。 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文件中。