2013-05-26 42 views
1

我正在爲我正在編寫的網絡項目編寫鏈接列表實現。它被分成兩個文件:llist.h和llist.c。我在幾個項目文件中加入了llist.h,編譯時鏈接到我編譯的包含llist.c的庫。不幸的是,我得到了llist.h中每個方法頭的「多重定義」錯誤。即:C鏈接器:多重定義

../util//libdutil.a(llist.o): In function `LListContains': 
llist.c:(.text+0x0): multiple definition of `LListContains' 
../util//libdutil.a(llist.o):llist.c:(.text+0x0): first defined here 

我不太清楚爲什麼我得到這個錯誤。它曾經很好,但是因爲我添加了一個方法,所以這已經開始發生了。下面是整個h文件:

#ifndef _LLIST_H_ 
#define _LLIST_H_ 

typedef struct _LinkedList 
{ 
    int length; 
    void* data; 
    struct _LinkedList* head; 
    struct _LinkedList* tail; 
}* LinkedList; 

LinkedList LListContains(LinkedList list, void* data, int (*cmp)(const void *, const void *)); 

void* getDataLList(LinkedList list); 

LinkedList createLList(void* data); 

void* getFromHeadLList(LinkedList list, int pos); 

void* popHeadLList(LinkedList list); 

void* popTailLList(LinkedList list); 

LinkedList getNextLList(LinkedList current); 

LinkedList getPrevLList(LinkedList current); 

void addHeadLList(LinkedList list, void* data); 

void addTailLList(LinkedList list, void* data); 

void FreeLList(LinkedList list); 

#endif 

謝謝!

UPDATE:好,這個問題似乎來自下面的代碼片段在項目文件中的一個:

OPP_DIRECTION(getDirToXYPOS((XYPOS*)getFromHeadLList(memories[avID], 0), &curPos))) 

注意getFromHeadLList是我加入LLIST.H和LLIST定義的方法。 C。通過簡單地註釋掉該部分並添加一個虛擬參數,即:

OPP_DIRECTION(getDirToXYPOS(&curPos, &curPos))) 

它編譯得很好。

+1

如果您顯示正在用於編譯和鏈接的命令,這將有所幫助。並確保不要將'llist.c'添加到IDE的項目中(因爲它被編譯爲獨立的庫)。 – Inspired

+0

從技術上講,錯誤消息看起來像是已將'llist.c'放入靜態庫兩次,但這沒有意義(但是,嘗試從零開始重新編譯庫,擦除.a文件)。爲了確保在項目中沒有'llist.c',請嘗試鏈接而不使用'-ldutil'命令開關。如果編譯,你不知何故將llist.c包含在項目中。 – Inspired

回答

1

很可能您已將您的llist.c編譯到您的項目以及靜態庫中。

+0

這是我檢查的第一件事情,不幸的是,情況並非如此。奇怪的是,在過去的3天裏我根本沒有更改makefile,而當我在「getFromHeadLList」方法(我在c文件中定義的方法)中添加時,這個問題在20分鐘前剛剛出現。 – A0A

+0

你使用某種IDE嗎?你有沒有在IDE中打開.c文件來添加該方法?你的IDE實際上是否使用你的Makefile? – Inspired

+0

不,沒有IDE。但情節已經加重,但我認爲這不是一個問題;它似乎來自調用某個項目文件中的某個方法。我即將更新OP的信息,感謝迄今的幫助。 – A0A