нерешенные внешние ошибки - PullRequest
       32

нерешенные внешние ошибки

0 голосов
/ 27 февраля 2012

У меня есть следующие файлы .h и .cpp

Если мне нужно, я включу полные коды определений функций

Когда я компилирую свою программу, я получаю ошибки, показанные в конце

hash.h

    #define BUCKETS 64
       #define B_ENTRIES 50000
       int curr_tanker;
       typedef unsigned long int ulong;
typedef struct bucket
{
    int bucket_id;
    ulong bucket_entries;
}bucket;

typedef struct tanker_record
{
    ulong tanker_id;
    ulong tanker_size;
    ulong num_of_entries;
    ulong bucket_entry_count;
   }tanker_record;
typedef struct fpinfo
{ 
    unsigned long chunk_offset;
    unsigned long chunk_length;
    unsigned char fing_print[33];

}fpinfo;

struct fpinfo* InitHTable(fpinfo *);
int CreateTanker(tanker_record tr[]);
int Hash_CreateEntry(struct fpinfo *,struct fpinfo he,tanker_record tr);

ht.cpp

#include <stdlib.h>
#include <string.h>
#include<stdio.h>
#include <iostream>

#include "ht.h"

struct fpinfo* InitHTable(struct fpinfo ht[][B_ENTRIES])
{
}
int CreateTanker(tanker_record tr[])
{
}
int
Hash_CreateEntry(struct fpinfo *t[][B_ENTRIES],struct fpinfo he,tanker_record tr[])
{
}
static void
WriteHTtoFile(struct fpinfo *t[][B_ENTRIES],int this_tanker)
{
}

main.cpp

#include<iostream>
#include"ht.cpp"
#include<conio.h>
#include<stdlib.h>

void main(int argc, char **argv)
{
static fpinfo hash_table[BUCKETS][B_ENTRIES];
static tanker_record tr[100];
InitHTable(&hash_table[0][0]);
CreateTanker(tr);
struct fpinfo fp;
... 
ar = Hash_CreateEntry(&hash_table[0][0], fp,tr[0]);

я получаю следующие ошибки, когда пытаюсь скомпилировать его с помощью vc2010

1> main.obj: ошибка LNK2005: «struct fpinfo * __cdecl InitHTable (struct fpinfo (* const) [50000])» (? InitHTable @@ YAPAUfpinfo @@ QAY0MDFA @ U1 @@ Z) уже определена в ht. OBJ

1> main.obj: ошибка LNK2005: «int __cdecl CreateTanker (struct tanker_record * const)» (? CreateTanker @@ YAHQAUtanker_record @@@ Z) уже определен в ht.obj

1> main.obj: ошибка LNK2005: «int __cdecl Hash_CreateEntry (struct fpinfo * (* const) [50000], struct fpinfo, struct tanker_record * const)» (? Hash_CreateEntry @@ YAHQAY0MDFA @ PAUfpinerUU @) @@@ Z) уже определено в ht.obj 1> main.obj: ошибка LNK2005: «int curr_tanker» (? Curr_tanker @@ 3HA) уже определено в ht.obj 1> main.obj: ошибка LNK2019: неразрешенный внешний символ «int __cdecl Hash_CreateEntry (struct fpinfo *, struct fpinfo, struct tanker_record)» (? Hash_CreateEntry @@ YAHPAUfpinfo @@ U1 @ Utanker_record @@@ Z) ссылка на функцию _main 1> main.obj: ошибка LNK2019: неразрешенный внешний символ "struct fpinfo * __cdecl InitHTable (struct fpinfo *)" (? InitHTable @@ YAPAUfpinfo @@ PAU1 @@ Z), на который имеется ссылка в функции _main

СПАСИБО ЗА ВАШУ ПОМОЩЬ !!

Ответы [ 2 ]

1 голос
/ 27 февраля 2012

Вы включаете ht.cpp из main.cpp, который будет включать все определения функций, уже определенных в самом ht.cpp.

Вы хотите включить ht.h.

В этой ситуации это не поможет, но вы должны также защитить заголовочный файл с помощью include guard:

#ifndef HT_H
#define HT_H

// contents of ht.h

#endif

Вам также необходимо, чтобы аргументы объявлений функций соответствовали определениям:

struct fpinfo* InitHTable(struct fpinfo[][B_ENTRIES]);
// Missing:                              ^^^^^^^^^^^

int CreateTanker(tanker_record tr[]); // OK

int Hash_CreateEntry(struct fpinfo*[][B_ENTRIES],struct fpinfo,tanker_record[]);
// Missing                         ^^^^^^^^^^^^^                            ^^
1 голос
/ 27 февраля 2012

Добавьте в свой заголовок «include guard», чтобы его содержимое не «просматривалось» дважды после предварительной обработки. Для Microsoft #pragma once в начале файла .h. В общем, добавьте:

#ifndef __YOUR_HEADER_H
#define __YOUR_HEADER_H
// all the stuff from the header here
#endif

Удостоверьтесь, что вы приняли последовательную «уникальную» схему именования для каждого из ваших заголовков. __YOUR_HEADER_H будет, например, customio.h в __CUSTOM_IO_H.

...