2012-07-07 56 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