2012-07-07 67 views
2

我刚回到C编程领域,我遇到了一个我认为是链接器相关的问题。此函数声明的预期符号问题

我也第一次使用cmake,所以这可能会增加我的挫折感。

我已经包括包含我的代码试图使用一个typedef第三方头文件,它有这样一行:

typedef struct pcap pcap_t; 

,所以我的代码有

pcap_t *var; 
//later..... 
var->fd;// this line throws the error 

会抛出

error: dereferencing pointer to incomplete type 

所以我只是想念另一个包含文件,或者这是一个链接器的问题?我正在QtCreator中构建这个代码并使用cmake。我可以在a_t上查看包含头文件中的typedef声明,但我似乎无法深入了解“struct a”本身,以查看它来自哪里。

感谢

编辑上面的代码,以反映我使用我已经包含在我的源文件的报头中的PCAP库

所以文件中以下行

#include <net/bpf.h> 
#include <pcap/pcap.h> 

所以我之间猜这两个包括,我错过了pcap结构的定义。我在哪里可以找到它?

感谢

+0

你能告诉我们你的结构吗? – Blood 2012-07-07 15:11:56

+0

的结构来自一个标准的Linux库和包括我发行 – Derek 2012-07-07 15:16:06

+0

的一部分,有没有足够的信息来告诉一些关于你的问题。你为什么不只是发布更多的代码? – Blood 2012-07-07 15:17:36

回答

4

typedef声明做了两两件事。它声明了struct a类型的东西的存在。它还声明a_tstruct a的别名。声明一个没有任何信息来确定其大小的类型的存在被C语言称为不完整类型。该声明通俗地称为正向声明,并且该类型通俗地被称为不透明到代码中永远不会看到该类型的定义的那些部分。

typedef struct a a_t; 
a_t *var; 

C语言允许指向不完整类型的指针被定义。指向不完整类型的指针本身并不完整,因为指向类型的指针与void指针的大小相同。但是,你的代码,然后试图取消引用指针:

var->member; 

由于不存在struct a可用定义,编译器在你的程序发生了错误,并告诉你这件事。这不是链接器问题,而是程序中的语义错误。

不透明类型是一种隐藏类型用户实现细节的方法。也就是说,它是C提供接口的方式:

typedef struct a a_t; 

a_t *a_create(); 
void a_destroy (a_t *); 
int a_get_member (a_t *); 
void a_set_member(a_t *, int); 

然后,在您的代码中,您需要使用该接口。

a_t *var = a_create(); 
a_set_member(var, 10); 
int m = a_get_member(var); 
a_destroy(var); 

实现接口实际上定义什么struct a看起来像源文件。既然你说你在调试器中没有引用的定义,这可能意味着你没有在程序中的任何地方提供定义。

编辑:看来你要使用的数据包捕获库。您需要将<pcap.h>头文件包含到您的代码中,并链接到-lpcap。如果头文件或库不存在,则需要为您的操作系统安装数据包捕获开发包。 <pcap.h>已经为pcap_t做了一个typedef,它是故意不透明的。所以你将不得不使用头文件定义的接口来访问你想要的信息。

+0

谢谢你的好解释。在回到代码中查看我包含的实际库后,我编辑了这个问题。你知道那些定义在哪里吗? – Derek 2012-07-07 16:48:53

+0

@Derek:我根据您的修改更新了我的答案。问候 – jxh 2012-07-07 16:55:02

+0

是pcap.h不同于pcap/pcap.h?我似乎能够找到大量的包含文件在/ usr/include中,似乎有相似的内容 – Derek 2012-07-07 17:09:48