문제

좋아요, 방금 마지막 컴파일러 오류를 완료했는데 (그래서 생각했습니다) 이러한 오류가 나타났습니다.

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는 무기의 정적 상수이며 weighonsdb :: pi와 적절한 #include를 사용하여 다른 클래스에서 참조합니다 (이 문제는 무엇입니까?)

대부분의 다른 오류는 정적 변수와 Allegro 게임 라이브러리의 타이머에 대한 정적 메소드에서 비롯됩니다.

이러한 오류의 원인은 무엇이며 어떻게 제거 할 수 있습니까?

미리 감사드립니다

--------------- 편집 ---------------------

요청대로, 무기 :: pi가 선언되고 정의되는 곳. 무기로 선언됩니다.

public:
    static double PI;

그러나 다른 클래스 드라이버에서 정의됩니다 .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"로 표시해야 할 것입니다. STATIC은 인스턴스가 아닌 클래스를 소유하게합니다. Const는이를 불변으로 만듭니다 (다양한 최적화를 가능하게합니다).

상수를 재현하는 대신 Math.h에서 M_PI를 사용하는 것을 고려할 수도 있습니다.

편집하다: 괄호로 더 정확한 용어를 추가했습니다. WP의 의견으로 인해 정의, 초기화.

한 곳에서 변수를 선언하고 다른 장소에 값을 할당해도 오류가 발생하지 않아도됩니다. 참조 객체를 정의한 모든 파일의 상단에 무기 SDB.H를 포함시켜야합니다.

예 : Driver.cpp 상단에 "#include weaponsdb.h"가 나타나는지 확인하십시오.

도움이 되었기를 바랍니다!

다른 사람들의 답변에서 귀하의 의견을 읽음으로써 함수 내부에 값을 할당하는 것처럼 보입니다. 당신은 다음과 같습니다.

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

.. 구현 파일의 글로벌 범위 (함수 내부가 아닌)에서 아마도 무기 SDB.cpp. 그리고이 경우, "const"가 적절할 것입니다. 실제로, 당신은 그것을 .cpp에 넣는 것에 대한 부분을 건너 뛰고 무기 SDB.h에서 직접 할 수 있습니다.

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

끔찍한 정적 회원이 없습니다. 정적 멤버 정의를 하나의 파일로 집중시킨 다음 해당 파일을 연결하지 않습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top