【问题标题】:Expected symbol problems with this function declaration此函数声明的预期符号问题
【发布时间】:2012-07-07 15:06:31
【问题描述】:

我刚刚回到 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 结构的定义。我在哪里可以找到它?

谢谢

【问题讨论】:

  • 结构来自一个标准的 linux 库,包含是我发行版的一部分
  • 没有足够的信息来说明您的问题。为什么不发布更多代码?
  • 我看看能不能发更多,谢谢你看
  • 您获得typedef 的标头是否包含struct a 或前向声明?
  • 不是链接器错误,而是编译时错误。您在范围内没有 struct a 的声明。您没有为编译器提供足够的信息来知道在哪里寻找var-&gt;member,因此它无法生成代码。您需要包含定义 struct a 的标头,而不仅仅是定义 typedef 的标头。

标签: c qt cmake


【解决方案1】:

typedef 语句做了两件事。它声明存在struct a 类型的东西。它还声明a_tstruct a 的别名。在没有任何信息来确定其大小的情况下声明类型的存在被 C 语言称为不完整类型。声明通俗地称为前向声明,而类型通俗地称为opaque,用于那些永远无法看到类型定义的代码部分。

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 的样子。由于您说您在调试器中没有要引用的定义,这可能意味着您没有在程序的任何地方提供定义。

编辑:您似乎正在尝试使用数据包捕获库。您需要将&lt;pcap.h&gt; 头文件包含到您的代码中,并与-lpcap 链接。如果头文件或库不存在,您将需要为您的操作系统安装数据包捕获开发包。 &lt;pcap.h&gt; 已经为 pcap_t 创建了 typedef,并且它是故意不透明的。所以你必须使用头文件定义的接口来访问你想要的信息。

【讨论】:

  • 感谢您的精彩解释。在回到我的代码以查看我包含的实际库后,我编辑了这个问题。你知道在哪里可以找到这些定义吗?
  • pcap.h 与 pcap/pcap.h 不同吗?我似乎能够在 /usr/include 中找到很多包含类似内容的包含文件
  • @Derek:在我的系统上,我只有&lt;pcap.h&gt;,没有&lt;pcap/pcap.h&gt;,但是不同的系统不同,所以我不确定我能提供更多帮助。
猜你喜欢
  • 2011-03-25
  • 1970-01-01
  • 2017-01-26
  • 2016-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
相关资源
最近更新 更多