SWIG错误:被声明为'extern',后来被称为'static'

时间:2011-06-10 17:08:30

标签: c++ python c swig

我正在使用swig生成一个python C ++接口,这样我就可以在python中创建脚本来调用我的c ++函数。我已经达到了:

swig -c++ python filename.i

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

包含路径是我的python27的包含目录。

尝试使用gcc编译时,我得到了一大堆错误,说明我的许多函数都被声明为extern,现在是静态的。在原始的cpp文件中,我将一些函数声明为static。我从来没有宣称任何东西。这可能是由什么引起的?

这是我的界面文件

/*  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(type2 * Data,type3 ** Records,type2 ** Header)'被声明为'extern',后来被称为'static'

1 个答案:

答案 0 :(得分:5)

它们作为原型出现在标题中的事实隐含地将它们定义为extern函数。但是你也要声明它们是静态的。

考虑到C ++标签,我将在这里做出一个假设,所以请原谅我,如果你已经知道这一点,它就会成为光顾。 C中的static做的事情完全与C ++不同。在C ++中,static表示特定方法不属于类的实例,任何人都可以随时调用它。在C中,static关键字表示“此功能仅在此文件的范围内可见”。因此,当您声明某些静态内容时,您基本上禁止该文件之外的任何人使用它(将其视为等同于private的C)。

因此,如果这不是您的意图,请不要将其声明为静态。