Я пытаюсь импортировать файл заголовка c из python при использовании SWIG. (Я новичок в 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. Скажите, пожалуйста, если это дублируется с другими вопросами.
Документация SWIG для перечислений говорит:
Для перечислений крайне важно, чтобы исходное определение перечисления включалось где-то в файл интерфейса (либо в файл заголовка, либо в блок% {%}). SWIG только переводит перечисление в код, необходимый для добавления констант на язык сценариев. Ему нужна оригинальная декларация перечисления, чтобы получить правильные значения перечисления, назначенные компилятором C.
Поскольку вы вызвали SWIG с исходным файлом заголовка и аргументом -module
вы не выполнили это.
К счастью, обходной путь прост, добавьте следующий файл test.i:
%module test
%{
#include "test.h"
%}
%include "test.h"
И затем вызовите SWIG с
swig -Wall -python test.i
Этого будет достаточно для компиляции и запуска, как ожидалось. В основном все это делает добавление #include "test.h"
в файл test_wrap.c, который генерирует SWIG.