#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. Большое спасибо за терпеливое и четкое объяснение.