Linux下undefined reference to错误
各位:我在写一个双向链表程序。里面有一个FindElebyIndex 函数,是用来查找链表中指定序号元素的,但是我在编译连接时提示如下错误:
/tmp/ccSh2r0h.o: In function `main':
DoubleLinkList.c:(.text+0x2ee): undefined reference to `FindEleByIndex'
collect2: ld returned 1 exit status
我使用的命令是
gcc DoubleLinkList.c -o DoubleLinkList
然而我把这个函数注释后重新编译通过,然后取消注释,编译也通过,并且运行结果正确。可是不知这里面发生了什么。请有过类似经验的大牛告诉我为什么会这样。为什么注释后编译链接,再取消注释重新编译链接就好了呢?
我在网上搜这个错误,说是链接错误,但不知道错在了那里。
这是我的源代码:
//2011/05/08
//DoubleList的实现和基本操作。包括查找,删除,增加等。
#include<stdio.h>
#include<stdlib.h>
#define True 1
#define False 0
#define null NULL
typedef struct DNode
{
int data;
struct DNode* prior; //前驱结点
struct DNode* next; //后继结点
}DLinkList;
//void PrintDl(DLinkList* dl);
//头插法建表
int CreateDoubleLinkList_head(DLinkList *dl,int n)
{
DLinkList* s;int i;
dl->next=null;
dl->prior=null;
for(i=0;i<n;++i)
{
s=(DLinkList*)malloc(sizeof(DLinkList));
scanf("%d",&(s->data));
s->next=dl->next; //s的前驱指向下一个结点
s->prior=dl; //s插入头结点之后
dl->next=s; //dl指向刚插入的结点
if(s->next!=null)
{
s->next->prior=s; //若插入结点的下一个结点不为空,则后继结点的前驱指针域指向s
}
//printf("%d\n",dl->data);
}
// PrintDl(dl);
return True;
}
//尾插法
int CreateDoubleLinkList_tail(DLinkList *dl,int n)
{
DLinkList *s,*r;
int i=0;
dl->next=null;
dl->prior=null;
r=dl;
for(i=0;i<n;++i)
{
s=(DLinkList*)malloc(sizeof(DLinkList));
scanf("%d",&(s->data));
r->next=s; //插入尾结点之后
s->prior=r; //修改s的前驱指针域
r=s;
}
r->next=null; //尾结点next域设为空
return True;
}
//这里貌似出了一个链接错误:
///tmp/ccSh2r0h.o: In function `main':
//DoubleLinkList.c:(.text+0x2ee): undefined reference to `FindEleByIndex'
//collect2: ld returned 1 exit status
//不知是何原因,重新注释这个函数后就正确了。
//按序号查找第n个元素
int FindElebyIndex(DLinkList* dl,int index,int *element)
{
int i=0;
DLinkList* s=dl;
while(s!=null&&i<index)
{
++i;
s=s->next;
}
if(s==null)
{
return False;
}
*element=s->data;
return True;
}
//Print DL
void PrintDl(DLinkList* dl)
{
DLinkList* s=dl->next;
while(s!=null)
{
printf("%d\n",s->data);
s=s->next;
}
}
//Test
int main()
{
//头插法建表
DLinkList* dl =(DLinkList*)malloc(sizeof(DLinkList)); //建立带头结点的双向链表
printf("输入你想要建表的结点个数:\n");
int num=0;
scanf("%d",&num);
printf("输入这%d数:\n",num);
CreateDoubleLinkList_head(dl,num);//头插法建表
printf("链表中有的元素为:\n");
PrintDl(dl);
printf("====================================================\n");
//尾插法建表
DLinkList* doublelist=(DLinkList*)malloc(sizeof(DLinkList)); //建立带头结点的双向链表
printf("输入你想要建表的结点个数:\n");
int count=0;
scanf("%d",&count);
printf("输入这%d数:\n",count);
CreateDoubleLinkList_tail(doublelist,count);//头插法建表
printf("链表中有的元素为:\n");
PrintDl(doublelist);
//查找第n个元素并打印
int n;
printf("输入你想找的元素序号:");
scanf("%d",&n);
int x=0;
int *e=&x;
FindElebyIndex(doublelist,n,e);
printf("您想找的元素为:%d\n",*e);
return 0;
}