ungelöste externe Fehler
-
13-11-2019 - |
Frage
Ich habe die folgenden .h- und .cpp-Dateien
Bei Bedarf füge ich die vollständigen Codes der Funktionsdefinitionen hinzu
Wenn ich mein Programm kompiliere, werden am Ende die Fehler angezeigt
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]);
Ich erhalte die folgenden Fehlermeldungen, wenn ich versuche, es mit vc2010 zu kompilieren
1>main.obj :Fehler LNK2005:„struct fpinfo * __cdecl InitHTable(struct fpinfo (* const)[50000])“ (?InitHTable@@YAPAUfpinfo@@QAY0MDFA@U1@@Z) bereits in ht.obj definiert
1>main.obj :Fehler LNK2005:"int __cdecl createTanker (struct tanker_record * const)" (? CreateTanker @@ Yahqautanker_Record @@@ z) Bereits in ht.obj definiert
1>main.obj :Fehler LNK2005:"int __cdecl Hash_CreateEntry(struct fpinfo * (* const)[50000],struct fpinfo,struct tanker_record * const)" (?Hash_CreateEntry@@YAHQAY0MDFA@PAUfpinfo@@U1@QAUtanker_record@@@Z) already defined in ht.obj 1 > main.obj:Fehler LNK2005:"int Curr_tanker" (?Fehler LNK2019:Ungelöstes externes Symbol "int __cdecl Hash_CreateEntry (Struktur fpinfo *, struct fpinfo, struct tanker_record)" (?Fehler LNK2019:unaufgelöstes externes Symbol „struct fpinfo * __cdecl InitHTable(struct fpinfo *)“ (?InitHTable@@YAPAUfpinfo@@PAU1@@Z), referenziert in Funktion _main
VIELEN DANK FÜR IHRE HILFE!!
Lösung
Du schließt ein ht.cpp
aus main.cpp
, die alle Definitionen der bereits in definierten Funktionen enthält ht.cpp
selbst.
Sie möchten einbeziehen ht.h
stattdessen.
In dieser Situation hilft es nicht, aber Sie sollten die Header-Datei auch mit Include-Schutzvorrichtungen schützen:
#ifndef HT_H
#define HT_H
// contents of ht.h
#endif
Außerdem müssen die Argumente der Funktionsdeklarationen mit denen der Definitionen übereinstimmen:
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 ^^^^^^^^^^^^^ ^^
Andere Tipps
Fügen Sie einen „include Guard“ in Ihren Header ein, damit sein Inhalt nach der Vorverarbeitung nicht zweimal „gesehen“ wird.Für Microsoft, #pragma once
am Anfang der .h-Datei.Fügen Sie im Allgemeinen hinzu:
#ifndef __YOUR_HEADER_H
#define __YOUR_HEADER_H
// all the stuff from the header here
#endif
Stellen Sie sicher, dass Sie für jeden Ihrer Header ein einheitliches „eindeutiges“ Benennungsschema verwenden. __YOUR_HEADER_H
würde zum Beispiel reichen customio.h
hinein __CUSTOM_IO_H
.