SWIG错误:先声明为'extern'后声明为'static

1 投票
1 回答
9342 浏览
提问于 2025-04-16 19:20

我正在使用swig来生成一个Python和C++的接口,这样我就可以用Python脚本来调用我的C++函数。目前我已经做到了一些事情:

swig -c++ python filename.i

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

这里的包含路径是我的Python 2.7的包含目录。

但是当我尝试用gcc编译时,出现了一堆错误,提示我很多函数被声明为extern(外部)但现在是static(静态)。在原来的cpp文件中,我有一些函数是声明为static的,但我从来没有声明过任何东西为extern。这可能是什么原因呢?

这是我的接口文件

/*  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 个回答

9

在头文件中出现的这些函数,默认是外部函数(extern function)。不过,你同时也把它们声明成了静态函数(static)。

因为提到了C++,我这里要做个假设,如果你已经知道这些内容,请见谅,不想让你觉得我在教你。static在C语言中的含义和在C++中完全不同。在C++中,static表示某个方法不属于类的实例,任何人都可以随时调用它。而在C语言中,static这个关键词的意思是“这个函数只能在这个文件内部使用”。所以,当你把某个函数声明为静态时,其实就是在禁止文件外部的人使用它(可以把它理解为C语言中的private)。

所以,如果你不是这个意思,就不要把它声明为静态。

撰写回答