Ошибка SWIG: было объявлено ‘extern’, а позже ‘static’

#c #python #c #swig

#c #питон #c #swig #c #python

Вопрос:

Я использую swig для создания интерфейса python C , такого, что я могу создавать скрипты на python для вызова моих функций c . Я дошел до того, что:

 swig -c   python filename.i

gcc -c filename.cpp filename_wrap.cxx -shared -Ic:includepath
  

Где включаемый путь — это включаемый каталог моего python27.

При попытке скомпилировать с помощью gcc я получаю целую кучу ошибок, указывающих на то, что многие из моих функций были объявлены как extern и теперь статичны. В исходном cpp-файле я объявил некоторые из своих функций как статические. Я никогда ничего не объявлял внешним. Чем это может быть вызвано?

Это мой файл интерфейса

 /*  Interface */
%module ReadWrite
%{
    #include "ReadWrite.h"

%}
%include "ReadWrite.h"
  

Фрагмент заголовочного файла (имена изменены) выглядит следующим образом (ничто не объявлено как extern)

 static bool myfunc1(void);

static bool myfunc2 (type1 *Entry, type2 *Block, type2 *Data);

static bool myfunc3 (type2 *Data, type3 **Records, type2 **Header);

type4 myfunc4 (void) ;
  

Когда я делаю gcc -c ReadWrite.cpp ReadWrite_wrap.cxx -shared -Ic:includepath, я получу ошибки, подобные из gcc:

ReadWrite.cpp:682:79: ошибка: ‘bool myfunc3 (данные типа 2 *, записи типа 3 **, заголовок типа 2 **)’ был объявлен ‘внешним’, а позже ‘статическим’

Комментарии:

1. Без некоторых фрагментов нарушающего кода я не думаю, что возможно сделать внятное предположение.

2. Добавит код в основной пост. Мгновение.

3. Да, но, возможно, даже точная ошибка компилятора?

Ответ №1:

Тот факт, что они отображаются в заголовке как прототип, неявно определяет их как функцию extern. Однако вы ТАКЖЕ объявляете их как статические.

Учитывая тег C , я собираюсь сделать предположение здесь, поэтому, пожалуйста, простите меня, если вы уже знаете это, и это звучит как покровительственное. static в C делает что-то совершенно отличное от C . В C static означает, что определенный метод не принадлежит экземпляру класса и может быть вызван кем угодно в любое время. В C static ключевое слово означает «эта функция видна только в пределах этого файла». Итак, когда вы объявляете что-то статическое, вы фактически запрещаете его использование кем-либо за пределами этого файла (думайте об этом как о C-эквиваленте private ).

Так что, если это не входит в ваши намерения, не объявляйте это статическим.

Комментарии:

1. Ах, не беспокойтесь об этом. Большое спасибо, что помогли мне. Как вы, возможно, можете сказать, я довольно новичок во всем этом и пытаюсь ознакомиться с инструментами за пределами Visual Studios 10. На самом деле я объявил что-то, что не было статичным, как static в файле заголовка.

2. Большое спасибо за терпеливое и четкое объяснение.