我有一个代码,它利用Glib库创建一个新类型。现在代码如下:
.h
文件:
G_DECLARE_DERIVABLE_TYPE(NewTypeState, new_type_state, NEW, TYPE_STATE, ParentType)
.c
文件:
G_DEFINE_TYPE_WITH_PRIVATE(NewTypeState, new_type_state, NEW_TYPE_STATE)
现在,根据用于对象创建的 glib 文档,我们必须定义两个静态函数:
static new_type_init()
static new_type_class_init()
但是在代码中,func. 不是定义静态 new_type_init(( 而是声明为:
__declspec(dllexport) extern void new_type_init()
并定义为:
void new_type_init()
{}
代码在 Windows 上成功编译和链接,但在尝试在 Linux 上构建时,我删除了__declspec(dllexport)
,但我开始收到错误:
遵循非静态声明
现在我注释掉了 .h 文件中的声明,并且在 .c 文件中只有非静态定义,但在尝试构建它时出现链接器错误:
未定义的引用new_type_init
我什至将extern添加到定义中,但错误仍然存在。
有人可以解释上述行为吗?
编辑:
objdump -t <file-name> | grep -i <symbol-name>
的 O/P 为:
000000000000b440 l F .text 0000000000000023 symbol-name
0000000000000000 *UND* 0000000000000000 symbol-name
Extern 表示该函数稍后可用(即在此翻译单元中未定义(。静态强制函数在外部不可用。将 extern 添加到标头中的声明并从定义中删除 static,您可能会取得一些成功。话虽如此,我不了解 Glib,所以不能肯定地说。