[在Windows上成功使用Glib库构建的C代码在Linux上给出了编译器/链接器错误

问题描述 投票:0回答:1

我有一个利用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 doc,我们必须将两个静态函数定义为:

static new_type_init()

static new_type_class_init()

但是在代码中而不是定义静态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
c linux window glib gobject
1个回答
0
投票

外部表示该功能将在以后可用(即,在此翻译单元中未定义)。静态强制该功能在外部不可用。将extern添加到标题中的声明中,然后从定义中删除static,您可能会取得一些成功。话虽如此,我不知道Glib,所以不能肯定地说。

© www.soinside.com 2019 - 2024. All rights reserved.