C ++链接器错误

时间:2010-07-06 14:54:49

标签: c++ linker

我是C ++的新手,正在为一个班级做作业。我们获得了一个.txt文件,必须从中读取信息,并将其存储在链接列表中,然后将其打印给用户。经过几个小时的尝试操作我们给出的例子,再过几个小时尝试从头开始编写代码,我与两者都差不多。

该文件名为payroll.txt,在这种格式中有大约30行左右:
Clark Kent 55000 2500 0.07
Lois Lane 65000 1000 0.06
Tony Stark 70000 1500 0.05

我们的教授非常重视我们的代码,所以我希望它有所帮助。这是我的代码:

#include <cstdlib>
#include <stdio.h>
#include <cstdio>
#include <cstdlib>
#include <iostream>
using namespace std;

#define MAX_STR         100

/* Structure Definition */
typedef struct employeeType Employ;
struct employeeType {
   char first[MAX_STR];   /* first name */
   char last[MAX_STR];    /* last name */
   int salary;            /* salary */
   int bonus;             /* bonus */
   double deduc;          /* percent deduction */
   Employ *next;
};

/* operations on the data */
Employ *ReadRecord(); 
void PrintRecord(Employ *);

main()
{{ 
Employ *head, *tail, *newp, *tmp;
head = tail = newp = tmp = NULL;
FILE *in;                     /* file description */

/* open a file, check if it's there */
if( (in = fopen( "payroll.txt", "r" )) == NULL )
{
  printf( "Error opening file\n" );
  exit(1);
}
while( newp = ReadRecord() ) 
{
    /* Add object to the list */ 
    if( head == NULL ) 
    { 
        /* Beginning of the list */
        head = newp;

        /* Current record */
        tail = newp; 
    } 
    else 
    { 
        /* Previous record reference to new record */
        tail->next = newp;

        /* Current record */
        tail = newp; 
    }
}

/* End of the list */
tail->next = NULL; 

/* Loop through the list */
for( tmp=head; tmp!=NULL; tmp=tmp->next ) 
{ 
    PrintRecord( tmp ); 
} 

现在当我编译时,我得到错误:
[链接器错误]对ReadRecord的未定义引用()
[链接器错误]对PrintRecord的未定义引用(employeeType *)

我几乎可以肯定他在示例中给我们的ReadRecord和PrintRecord命令是伪代码意味着搞砸了我们,但我不知道那里会发生什么。我一直在倾注多本教科书,并寻找一种简单的方法来在线修复链接器错误,并且已经没有想法了。

如果有人能帮助我/指出正确的方向,我们将不胜感激。链接到链接列表和链接器错误的更多信息的网页链接会更加精彩。

谢谢,
亚当

5 个答案:

答案 0 :(得分:5)

链接器抱怨您已引用函数ReadRecordPrintRecord,但尚未编写它们。您可以在当前文件的末尾编写这些函数。您可以从这个模板开始:

// Read a record from the file and parse the data into a structure
Employ *ReadRecord (void) {

    // Use fgets() to read a line from the file

    // Create a new Employ object to hold the data

    // Use sscanf() to parse individual fields out of the string
    //   and store them in the new Employ object

    // Return a pointer to the new Employ object

    return (Employ*)NULL;
}

// Print the information from the structure to the screen
void PrintRecord (Employ *ptr) {

    // Use printf() to display the content of each field

    return;
}

将这些函数模板添加到文件中后,链接器不应再抱怨未定义的引用(因为现在已经创建了函数)。但是,代码将无法正常工作,因为这些函数实际上并不执行任何操作。您需要填写函数正文(根据作业的详细信息)。

编辑:我已经提供了一些提示(作为代码注释),以防您不知道从哪里开始。有关从文本文件解析数据或向屏幕显示信息的详细帮助,请参阅您的教科书(在这种情况下,它应该有许多可以帮助您的示例)。

更新:一些链接:

答案 1 :(得分:2)

对于那些只有原型的函数:

Employ *ReadRecord(); 
void PrintRecord(Employ *);

但没有尸体。所以链接器找不到它们。您是否忘记添加具有这些功能主体的另一个文件?

答案 2 :(得分:0)

您可能获得了一个头文件(.h)文件,但没有在其对应的源代码(.cpp,.cc,.cxx)文件中定义的ReadRecord(...)或PrintRecord(...)函数。要么是这样,要么你编译.c文件失败了,所以你的链接器没有.o文件可供包含。

答案 3 :(得分:0)

您尝试使用的两个功能ReadRecord()PrintRecord(Employ *)尚未定义。定义这些函数后,您将不再收到这些链接器错误。

根据您使用函数的方式判断,ReadRecord用于读取文件,从读取的信息创建Employ并返回。 PrintRecord旨在打印出Employ中包含的信息(可能以您教授提供给您的格式打印)。

我希望有所帮助。

答案 4 :(得分:0)

您只需要实现ReadRecord()PrintRecord()功能。显然, ReadRecord()应该从文件读取记录,使用文件描述符或文件名作为输入参数,PrintRecord()应该打印到作为输入参数给出的名称的stdout或文件。无论如何,细节是您的具体设计。