أخطاء خارجية لم يتم حلها
-
13-11-2019 - |
سؤال
لدي ملفات .h و.cpp التالية
إذا كان لا بد لي من ذلك فسوف أقوم بتضمين الرموز الكاملة لتعريفات الوظيفة
عندما أقوم بتجميع برنامجي أحصل على الأخطاء الموضحة في النهاية
التجزئة. ح
#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>الكائن الرئيسي :خطأ LNK2005:"struct fpinfo * __cdecl InitHTable(struct fpinfo (* const)[50000])" (؟InitHTable@@YAPAUfpinfo@@QAY0MDFA@U1@@Z) تم تعريفه بالفعل في ht.obj
1>الكائن الرئيسي :خطأ LNK2005:"int __cdecl createTanker (struct tanker_record * const)" (؟ createTanker yahqautanker_recordz) تم تعريفه بالفعل في ht.obj
1>الكائن الرئيسي :خطأ LNK2005:"int __cdecl hash_createentry (struct fpinfo * ( * const) [50000] ، struct fpinfo ، struct tanker_record * > 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_createentrynخطأ LNK2019:الرمز الخارجي الذي لم يتم حله "struct fpinfo * __cdecl InitHTable(struct fpinfo *)" (?InitHTable@@YAPAUfpinfo@@PAU1@@Z) المشار إليه في الوظيفة _main
شكرا لمساعدتك!!
المحلول
أنت بما في ذلك ht.cpp
من main.cpp
, ، والتي ستتضمن جميع تعريفات الوظائف المحددة بالفعل في ht.cpp
بحد ذاتها.
تريد أن تشمل ht.h
بدلاً من.
لن يساعد ذلك في هذه الحالة، ولكن يجب عليك أيضًا حماية ملف الرأس باستخدام حراس التضمين:
#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 ^^^^^^^^^^^^^ ^^
نصائح أخرى
أضف "حارس التضمين" في رأسك، بحيث لا "تُرى" محتوياته مرتين بعد المعالجة المسبقة.لشركة مايكروسوفت، #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
.