LNK2001 خطأ وLNK2019 خطأ (C ++) - طلب بعض التعلم عن هذه الأخطاء

StackOverflow https://stackoverflow.com/questions/380153

  •  22-08-2019
  •  | 
  •  

سؤال

حسنا، لذلك أنا انتهيت للتو من تقريري الأخير خطأ مترجم (حتى ظننت)، وجاء هذه الأخطاء الأعلى:

1>GameEngine.obj : error LNK2001: unresolved external symbol "public: static double WeaponsDB::PI" (?PI@WeaponsDB@@2NA)
1>Component.obj : error LNK2001: unresolved external symbol "public: static double WeaponsDB::PI" (?PI@WeaponsDB@@2NA)
1>Coordinate.obj : error LNK2019: unresolved external symbol "public: static double WeaponsDB::PI" (?PI@WeaponsDB@@2NA) referenced in function "public: double __thiscall Coordinate::distanceFrom(class Coordinate *)" (?distanceFrom@Coordinate@@QAENPAV1@@Z)
1>Driver.obj : error LNK2001: unresolved external symbol "public: static double WeaponsDB::PI" (?PI@WeaponsDB@@2NA)
1>Environment.obj : error LNK2001: unresolved external symbol "public: static double WeaponsDB::PI" (?PI@WeaponsDB@@2NA)
1>Environment.obj : error LNK2001: unresolved external symbol "public: static bool Environment::spyFlag" (?spyFlag@Environment@@2_NA)
1>Environment.obj : error LNK2001: unresolved external symbol "private: static class Environment * Environment::instance_" (?instance_@Environment@@0PAV1@A)
1>Environment.obj : error LNK2019: unresolved external symbol "public: static void __cdecl Environment::spyAlertOver(void)" (?spyAlertOver@Environment@@SAXXZ) referenced in function "public: void __thiscall Environment::notificationOfSpySuccess(void)" (?notificationOfSpySuccess@Environment@@QAEXXZ)
1>GameDriver.obj : error LNK2019: unresolved external symbol "public: static void __cdecl MainMenu::gameOver(int)" (?gameOver@MainMenu@@SAXH@Z) referenced in function "public: static void __cdecl GameDriver::run(void)" (?run@GameDriver@@SAXXZ)
1>GameDriver.obj : error LNK2019: unresolved external symbol "public: static void __cdecl GameDriver::gatherInput(void)" (?gatherInput@GameDriver@@SAXXZ) referenced in function "public: static void __cdecl GameDriver::run(void)" (?run@GameDriver@@SAXXZ)
1>GameDriver.obj : error LNK2019: unresolved external symbol "public: static void __cdecl GameDriver::ticker(void)" (?ticker@GameDriver@@SAXXZ) referenced in function "public: static void __cdecl GameDriver::run(void)" (?run@GameDriver@@SAXXZ)
1>GameDriver.obj : error LNK2001: unresolved external symbol "public: static int GameDriver::ticks" (?ticks@GameDriver@@2HA)
1>GameDriver.obj : error LNK2001: unresolved external symbol "public: static bool GameDriver::evaluatingInputFlag" (?evaluatingInputFlag@GameDriver@@2_NA)
1>GameDriver.obj : error LNK2001: unresolved external symbol "public: static bool GameDriver::keyQuitFlag" (?keyQuitFlag@GameDriver@@2_NA)
1>GameDriver.obj : error LNK2001: unresolved external symbol "public: static bool GameDriver::keyToggleWeaponRightFlag" (?keyToggleWeaponRightFlag@GameDriver@@2_NA)
1>GameDriver.obj : error LNK2001: unresolved external symbol "public: static bool GameDriver::keyToggleWeaponLeftFlag" (?keyToggleWeaponLeftFlag@GameDriver@@2_NA)
1>GameDriver.obj : error LNK2001: unresolved external symbol "public: static bool GameDriver::keyFireFlag" (?keyFireFlag@GameDriver@@2_NA)
1>GameDriver.obj : error LNK2001: unresolved external symbol "public: static bool GameDriver::keyLeftFlag" (?keyLeftFlag@GameDriver@@2_NA)
1>GameDriver.obj : error LNK2001: unresolved external symbol "public: static bool GameDriver::keyRightFlag" (?keyRightFlag@GameDriver@@2_NA)
1>GameDriver.obj : error LNK2001: unresolved external symbol "public: static bool GameDriver::keyUpFlag" (?keyUpFlag@GameDriver@@2_NA)
1>GameDriver.obj : error LNK2001: unresolved external symbol "public: static bool GameDriver::keyDownFlag" (?keyDownFlag@GameDriver@@2_NA)
1>GUI_Env.obj : error LNK2001: unresolved external symbol "private: static struct BITMAP * GUI_Env::buffer" (?buffer@GUI_Env@@0PAUBITMAP@@A)
1>GUI_Info.obj : error LNK2001: unresolved external symbol "private: static struct BITMAP * GUI_Info::buffer" (?buffer@GUI_Info@@0PAUBITMAP@@A)
1>MenuDriver.obj : error LNK2019: unresolved external symbol "public: static void __cdecl MainMenu::displayMenu(void)" (?displayMenu@MainMenu@@SAXXZ) referenced in function "public: static void __cdecl MenuDriver::start(void)" (?start@MenuDriver@@SAXXZ)
1>SpaceObjectFactory.obj : error LNK2001: unresolved external symbol "private: static class SpaceObjectFactory * SpaceObjectFactory::_instance" (?_instance@SpaceObjectFactory@@0PAV1@A)
1>Spy.obj : error LNK2019: unresolved external symbol "public: virtual bool __thiscall UnFormationable::sameTypeOfSpaceObjectAs(class SpaceObject *)" (?sameTypeOfSpaceObjectAs@UnFormationable@@UAE_NPAVSpaceObject@@@Z) referenced in function "public: virtual bool __thiscall Spy::sameTypeOfSpaceObjectAs(class SpaceObject *)" (?sameTypeOfSpaceObjectAs@Spy@@UAE_NPAVSpaceObject@@@Z)
1>WeaponsDB.obj : error LNK2001: unresolved external symbol "private: static class WeaponsDB * WeaponsDB::_instance" (?_instance@WeaponsDB@@0PAV1@A)
1>C:\Users\Owner\Desktop\Bosconian\code\Bosconian\Debug\Bosconian.exe : fatal error LNK1120: 23 unresolved externals

حسنا، وهنا لمحة موجزة.

وPI هو ثابت ثابت في WeaponsDB وتتم الإشارة من قبل الطبقات الأخرى التي تستخدم WeaponsDB :: PI و# تشمل المناسب (ما هو الخطأ في هذا؟)

ومعظم أخطاء أخرى تنبع من المتغيرات ثابتة وأساليب ثابتة للتوقيت من المكتبة اليجرو الألعاب.

ما هي أسباب هذه الأخطاء وكيف يمكن يمكنني التخلص منها؟

وشكرا مقدما

و---------------- التحرير -------------------

وعلى النحو المطلوب، حيث يتم تعريف WeaponsDB :: PI ومحددة. أعلن في WeaponsDB.h:

public:
    static double PI;

ولكن يتم تعريفه في الصف Driver.cpp آخر:

WeaponsDB::PI = 4*atan(1.0);

وإذا كانت هذه هي واحدة من المشاكل مع قانون بلدي أنا أحب أن أعرف لماذا هذا يسبب خطأ.

هل كانت مفيدة؟

المحلول

وفي معظم الأحيان، عندما رابط فشلت في كشف عضو ثابت فذلك لأن لك نسيت أن تحدد حقا في مكان ما، كما أشير من قبل:

// header
class X {
   static const int y;
};

// cpp
const int X::y = 1;

ولكن في حالتك، كما لم تكن فقط في عداد المفقودين متغيرات ثابتة ولكن أيضا كل ما تبقى من أعضاء رهاني هو أنك لا ربط ملف تطبيق (ق) (.CPP) في المشروع. يجب توفير وحدة تجميع يحدد الرموز التي تم تعريفها في الرأس، وجعل الترجمة البيئة وربطها معا. إذا رموز تنتمي إلى وحدة تجميع في مكتبة الخارجية (من المشروع الحالي) ثم يجب أن نتذكر لربط مع المكتبة.

نصائح أخرى

وهذا

WeaponsDB::PI = 4*atan(1.0);

وبتعيين قيمة PI. ولكنها لا تخلق مساحة لأنها (لا يعرف ذلك).

وهذا يخلق مساحة لل(يعرف) PI وبتعيين قيمة (تهيئة) عليه.

double WeaponsDB::PI = 4*atan(1.0);

وربما يجب عليك أيضا وضع علامة PI باسم "CONST ثابت" وليس فقط "ثابت". ثابت يجعلها مملوكة من قبل الطبقة بدلا من المثيل. CONST يجعله غير قابل للتغيير (ويمكن تحسينات مختلفة).

ويمكنك أن تجرب استخدام M_PI من math.h بدلا من إعادة ثابت.

تعديل : في مضافة بين قوسين شروط أكثر دقة: يعرف، تهيئة بسبب تعليق الفسفور الابيض في

وإعلان متغير في مكان واحد وأسند لها قيمة في مكان آخر لا ينبغي أن يسبب أي أخطاء. تأكد من أن تشمل WeaponsDB.h في الجزء العلوي من كل الملفات التي تشير إلى أشياء محددة هناك.

مثال:. في الجزء العلوي من Driver.cpp، تأكد من "# تشمل WeaponsDB.h" يظهر

وآمل أن يساعد هذا!

ومن قراءة تعليقاتكم في إجابات الآخرين، ويبدو كأنك تعيينه قيمة داخل وظيفة. تحتاج إلى أن يكون:

double WeaponsDB::PI = 4*atan(1.0);

و.. في النطاق العالمي (بمعنى ليس داخل وظيفة) من ملف التطبيق الخاص بك، ويفترض WeaponsDB.cpp. وفي هذه الحالة، "CONST" جي أنه سيكون مناسبا. في الواقع، يمكنك تخطي الجزء حول وضعه في .CPP ومجرد القيام بذلك مباشرة في WeaponsDB.h:

public:
    static const double PI = 4*atan(1.0);

وهناك عدد ضخم من أعضاء ثابتة في عداد المفقودين. يمكن أن يكون ذلك على التركيز الخاص بك ثابتة أعضاء التعاريف في ملف واحد، ومن ثم لم يكن لربط هذا الملف في؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top