Связывание проекта, где я использую статический член из другого проекта - PullRequest
0 голосов
/ 14 ноября 2011

У меня проблема со связыванием, у меня есть два проекта, который компилируется в две библиотеки (A.dll B.dll). В проекте A у меня есть статический Singleton singleton. Псудокод: Один из заголовков в проекте A

ClassA
...
...
Singleton singleton;
...
...

В каком-то месте проекта B в файле cpp у меня есть:

...
...
ClassA::singleton.SomeMethod();
...
...

Проект скомпилирован, но есть проблема с линковкой.

У меня есть эта проблема в FreeCryEngine SDK Это происходит, когда я пытаюсь вызвать CCryAction::GetCryAction() в GameDLL Project. Это не работает:

int a = CCryAction::GetCryAction()->IsInLevelLoad();

Ошибка 3, ошибка LNK2001: неразрешенный внешний символ "private: static класс CCryAction * CCryAction :: m_pThis " (? m_pThis @ CCryAction @@ 0PAV1 @ A) E: \ CryENGINE_v3_3_5_2456_FreeSDK \ Code \ Game \ GameDll \ GameStateRecorder.obj GameDll

Как выглядит этот метод?

static CCryAction * GetCryAction() { return m_pThis; }

1 Ответ

0 голосов
/ 14 ноября 2011

Вам нужно: в шапке

struct ClassA {
    static Singleton singleton;
};

// or  
extern Singleton g_singleton;

В файле cpp:

Singleton ClassA::singleton;

// or
Singleton g_singleton;

Так вы можете позвонить ClassA::singleton.someMethod() или ::g_singleton.someMethod() в единицах перевода которые включают в себя заголовок.Не забудьте связать объектный файл для cpp выше.

...