C链接器:多个定义

C链接器:多个定义,c,linker,C,Linker,我正在为我正在从事的一个网络项目编写一个链表实现。它被分成两个文件:llist.h和llist.c。我在几个项目文件中包括了llist.h,在编译时,我链接到我编译的库,其中包括llist.c。不幸的是,对于llist.h中的每个方法头,我都会得到一个“多定义”错误。即: ../util//libdutil.a(llist.o): In function `LListContains': llist.c:(.text+0x0): multiple definition of `LListCont

我正在为我正在从事的一个网络项目编写一个链表实现。它被分成两个文件:llist.h和llist.c。我在几个项目文件中包括了llist.h,在编译时,我链接到我编译的库,其中包括llist.c。不幸的是,对于llist.h中的每个方法头,我都会得到一个“多定义”错误。即:

../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
谢谢

更新:好的,问题似乎来自其中一个项目文件中的以下代码片段:

OPP_DIRECTION(getDirToXYPOS((XYPOS*)getFromHeadLList(memories[avID], 0), &curPos)))
请注意,getFromHeadList是我添加到llist.h并在llist.c中定义的方法。只需注释掉该部分并添加一个伪参数,即:

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

它可以很好地编译。

很可能您已经将
llist.c
编译到您的项目以及静态库中。

很可能您已经将
llist.c
编译到您的项目以及静态库中。

如果您显示用于编译和链接的命令,将会有所帮助。并且确保不要将
llist.c
添加到IDE的项目中(因为它是作为一个单独的库编译的)。从技术上讲,错误消息看起来像是您将
llist.c
两次放入静态库中,但这没有意义(但是,尝试从头开始重新编译库,删除.a文件)。为了确保项目中没有
llist.c
,请尝试在不使用
-ldutil
命令开关的情况下进行链接。如果它可以编译,那么您就在项目中包含了llist.c。如果您显示用于编译和链接的命令,这会有所帮助。并且确保不要将
llist.c
添加到IDE的项目中(因为它是作为一个单独的库编译的)。从技术上讲,错误消息看起来像是您将
llist.c
两次放入静态库中,但这没有意义(但是,尝试从头开始重新编译库,删除.a文件)。为了确保项目中没有
llist.c
,请尝试在不使用
-ldutil
命令开关的情况下进行链接。如果它编译了,那么您就在项目中包含了llist.c。这是我检查的第一件事,不幸的是,事实并非如此。奇怪的是,在过去的3天里,我根本没有更改makefile,而这个问题在20分钟前我添加了“getFromHeadlist”方法(我在c文件中定义了这个方法)时突然出现。你使用某种IDE吗?您是否在IDE中打开了.c文件以添加该方法?你的IDE真的使用你的Makefile吗?不,没有IDE。尽管情节变得越来越复杂,但我不认为这是h文件的问题;它似乎来自于调用其中一个项目文件中的一个方法。我将要用这些信息更新OP,感谢到目前为止的帮助。这是我检查的第一件事,不幸的是,事实并非如此。奇怪的是,在过去的3天里,我根本没有更改makefile,而这个问题在20分钟前我添加了“getFromHeadlist”方法(我在c文件中定义了这个方法)时突然出现。你使用某种IDE吗?您是否在IDE中打开了.c文件以添加该方法?你的IDE真的使用你的Makefile吗?不,没有IDE。尽管情节变得越来越复杂,但我不认为这是h文件的问题;它似乎来自于调用其中一个项目文件中的一个方法。我将要用这些信息更新OP,感谢迄今为止的帮助。