2013-07-27 2 views
0

Я создал DLL для своего консольного приложения в Visual Studio. В моей DLL у меня есть класс с именем Dialog_MainMenu с файлом * .cpp и * .h.Неразрешенный внешний символ _declspec (dllimport)

следующее сообщение об ошибке:

Error 9 error LNK2001: unresolved external symbol "__declspec(dllimport) public: static enum Dialog_MainMenu::GAME_STATES Dialog_MainMenu::CurrentGameState" (_imp[email protected][email protected]@[email protected]@A) C:\Users\Kevin\Desktop\c++ projects\development_testing\The Intense Adventure\Dialogs\Dialog_MainMenu.obj Dialogs

Что я вроде не понимаю. Это произошло только тогда, когда я добавил перечисление в свой прототип в моем файле заголовка.

Заголовочный файл:

#ifdef DIALOG_MAINMENU_EXPORTS 
#define DIALOG_MAINMENU_API __declspec(dllexport) 
#else 
#define DIALOG_MAINMENU_API __declspec(dllimport) 
#endif 

class Dialog_MainMenu { 
public: 
    static DIALOG_MAINMENU_API enum GAME_STATES { 
     MAINMENU, GAME, OPTIONS, CREDITS, QUIT 
    }; 
    static DIALOG_MAINMENU_API GAME_STATES CurrentGameState; 
    DIALOG_MAINMENU_API GAME_STATES GetState(); 
}; 

(Не знаю, если проблема лежит здесь, так что я просто добавить его) CPP файл в общем:

//Get state 
Dialog_MainMenu::GAME_STATES Dialog_MainMenu::GetState() { 
// Code.. 
} 

//Switching state 
Dialog_MainMenu::CurrentGameState = Dialog_MainMenu::GAME_STATES::GAME; 

I было бы очень полезно, любая помощь или по крайней мере некоторые советы, где я могу узнать больше об этой проблеме.

+0

Вы ссылаетесь на файл .lib? –

+0

я уверенный сделал. Я даже проверял тройку. –

+0

Можете ли вы добавить ссылку, используемую для вашего вопроса? – greatwolf

ответ

3

Вам необходимо определить статический член в файле cpp в глобальной области.

Dialog_MainMenu::GAME_STATES Dialog_MainMenu::CurrentGameState; 

В качестве альтернативы вы также можете присвоить ему некоторое начальное значение.

Dialog_MainMenu::GAME_STATES Dialog_MainMenu::CurrentGameState = Dialog_MainMenu::GAME_STATES::GAME; 

EDIT:

I've created an DLL for my Console Application in Visual Studio. In my DLL I have a Class named Dialog_MainMenu with has a *.cpp file and a *.h file.

OK - при компиляции DLL - экспортируемого типы. Итак, вам нужно указать define статический член в файле .cpp файла dll. Вы также должны убедиться, что вы включили определение DIALOG_MAINMENU_EXPORTS в настройках компилятора. Это гарантирует, что типы экспортируются.

Теперь, когда вы связываете консольное приложение с dll - вы должны заголовок dll #include и не разрешать никакое определение DIALOG_MAINMENU_EXPORTS в настройках компилятора (просто оставьте настройки по умолчанию). Это заставит компилятор понять, что теперь вы импортируете типы из вашей DLL в консольное приложение.

Надеюсь, теперь это ясно.

+0

А где это? Кажется, не может найти место, где я набрал следующую строку, которую вы набрали сначала. –

+0

Точно так же, как вы 'declare' методы в' .h' файле и 'define' их в' .cpp' - вам также нужно «определять» члены 'static'. Вы можете поместить эту строку кода прямо над 'Dialog_MainMenu :: GAME_STATES Dialog_MainMenu :: GetState() {' – YK1

+0

Это просто дайте мне ошибку: определение члена статических данных dllimport не разрешено –

1

Существует проблема с экспортом статических членов класса:

If you declare a static data member within a class definition as dllexport, a definition must occur somewhere within the same program (as with nonclass external linkage).

Но то, что я обычно делаю это использовать метод доступа. Методы статической функции связаны штрафом.

//.h file 
class Dialog_MainMenu { 
public: 
    static DIALOG_MAINMENU_API enum GAME_STATES { 
     MAINMENU, GAME, OPTIONS, CREDITS, QUIT 
    }; 
    static GAME_STATES CurrentGameState; 
    DIALOG_MAINMENU_API GAME_STATES GetState(); 

    static DIALOG_MAINMENU_API GAME_STATES& GetCurrentState(); 
}; 

//.cpp file 

GAME_STATES& Dialog_MainMenu ::GetCurrentState() 
{ 

return CurrentGameState; 
} 
Смежные вопросы