Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在windows上成功使用Glib库构建的C代码在linux上出现编译器/链接器错误_C_Linux_Window_Glib_Gobject - Fatal编程技术网

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

在windows上成功使用Glib库构建的C代码在linux上出现编译器/链接器错误,c,linux,window,glib,gobject,C,Linux,Window,Glib,Gobject,我有一个利用Glib库创建新类型的代码。现在代码如下: .h文件: G_DECLARE_DERIVABLE_TYPE(NewTypeState, new_type_state, NEW, TYPE_STATE, ParentType) G_DEFINE_TYPE_WITH_PRIVATE(NewTypeState, new_type_state, NEW_TYPE_STATE) .c文件: G_DECLARE_DERIVABLE_TYPE(NewTypeState, new_type_sta

我有一个利用Glib库创建新类型的代码。现在代码如下:

.h
文件:

G_DECLARE_DERIVABLE_TYPE(NewTypeState, new_type_state, NEW, TYPE_STATE, ParentType)
G_DEFINE_TYPE_WITH_PRIVATE(NewTypeState, new_type_state, NEW_TYPE_STATE)
.c
文件:

G_DECLARE_DERIVABLE_TYPE(NewTypeState, new_type_state, NEW, TYPE_STATE, ParentType)
G_DEFINE_TYPE_WITH_PRIVATE(NewTypeState, new_type_state, NEW_TYPE_STATE)
现在,根据对象创建,我们必须将两个静态函数定义为:

static new_type_init()

static new_type_class_init()
但是在代码中,不是定义静态的新类型,而是定义func。声明如下:

__declspec(dllexport) extern void new_type_init()
定义为:

void new_type_init()
{}
代码在windows上成功编译并链接,但在尝试在linux上构建时,我删除了
\uuu declspec(dllexport)
,但我开始出现错误:

静态声明遵循非静态声明

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

未定义的引用新类型\u init

我甚至在定义中添加了extern,但错误仍然存在

有人能解释一下上述行为吗

编辑:

objdump-t | grep-i
的o/p为:

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

Extern表示该功能稍后可用(即,在本翻译单元中未定义)。静态强制功能在外部不可用。将extern添加到头中的声明中,并从定义中删除static,您可能会获得一些成功。也就是说,我不知道Glib,所以不能确定。

可能不相关,但您的G_DECLARE_derivatible_类型使用类本身作为父类:这似乎是错误的“外部静态”就像说“本地全局”或“我想要一辆蓝色的红色汽车”。使用你真正需要的,而不是两者都使用。@JussiKukkonen谢谢你指出这一点。那是个打字错误。已更正。@Lundin该代码仅具有
extern
。我指的是glib文档,它建议使用
static
storage类定义该方法,并且不需要声明该方法。看起来能说会道的宏解决了这个问题。但有趣的是,该函数是用uu declspec(dllexport)extern声明的,然后也被定义为非静态的,它与MSV c编译器一起工作,因为代码在windows上成功构建。我已经提到了方法定义是非静态的,我也尝试了
extern
,但错误仍然存在。你就是这样做的!您可以添加用于链接的命令行吗。您应该能够在设置详细标志后看到这一点。在cmake world中,这将通过
make VERBOSE=1
iirc实现。我使用了
make VERBOSE=1
,可以看到
/usr/bin/c++
命令,该命令正在创建
。因此
具有包含上述函数的
.o
文件。当你提到-
时,你是指这个吗?你能添加用于链接的命令行吗。有趣的是,C++不是使用CC,我想知道这是不是一个名字的问题,实际上在头文件中添加<代码>外部“C”…<代码>是有意义的。有一个.CPP文件,但是链接器找不到的符号都是.c文件的一部分。由于extern“C”不能在.C文件中使用,我不确定是否发生了名称损坏/usr/bin/c++可能是由于.cpp文件,c编译器将无法编译它。如果我错了,请纠正我。