繁体   English   中英

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

[英]C Code using Glib library building succesfully on windows gives compiler/linker error on linux

我有一个使用 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()

但是在代码中而不是定义静态 new_type_init() func。 声明为:

__declspec(dllexport) extern void new_type_init()

并定义为:

void new_type_init()
{}

并且代码在 Windows 上成功编译和链接,但是在尝试在 linux 上构建时,我删除了__declspec(dllexport)但我开始收到错误:

静态声明遵循非静态声明

现在我注释掉了 .h 文件中的声明,并且在 .c 文件中只有非静态定义,但是在尝试构建它时,我得到了链接器错误:

未定义的引用new_type_init

我什至将extern添加到定义中,但错误仍然存​​在。

有人可以解释上述行为吗?

编辑:

o/p for objdump -t <file-name> | grep -i <symbol-name> objdump -t <file-name> | grep -i <symbol-name>是:

000000000000b440 l     F .text  0000000000000023              symbol-name
0000000000000000         *UND*  0000000000000000              symbol-name

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM