Swig конвертировать перечисление в заголовке

1

Я пытаюсь импортировать файл заголовка 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. Скажите, пожалуйста, если это дублируется с другими вопросами.

  • 0
    Я смутно помню, как столкнулся с этой проблемой много лет назад. Я думаю, что это ответ, который помог мне: stackoverflow.com/a/20112840/1212725
Теги:
swig

1 ответ

0

Документация 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.

  • 0
    Спасибо! Вы также знаете, как использовать их в Python? Да, эти переменные теперь имеют значения. Тем не менее, я могу инициализировать такое перечисление в Python? как в C: enum VALS someval = VAL1;
  • 0
    Какую версию Python вы используете? Уже есть несколько ответов, например stackoverflow.com/a/16502917/168175 stackoverflow.com/a/13442110/168175 stackoverflow.com/a/50356050/168175 , может быть, что-то умнее, в зависимости от того, какой именно элемент управления у вас есть и какая у вас семантика хотеть.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню