Неразрешенный внешний символ "public: void __thiscall..."

Я использую boost::function чтобы разрешить передачу функции Button конструктор, так что он содержит эту функцию. Вызывая его всякий раз, когда он активирован.

typedef boost::function< void() > Action;

В моем TitleState я создал кнопку, подобную этой.

  m_play( 
    ButtonAction, // This is where I pass a function to Button's Action argument
    sf::Vector2f( 500, 400 ), 
    sf::IntRect( 500, 400, 700, 500 ) 
  )

где ButtonAction является static void функция, хранящаяся в частном порядке в заголовке TitleState, определенная в файле реализации как просто вывод на консоль через std::cout (просто для проверки работоспособности).

В моем коде, если мышь нажимает кнопку в TitleState HandleEvents функция, программа вызывает эту кнопку Activate функция, которая выглядит следующим образом.

void Button::Activate() const {
  m_action(); // m_action is the Action member that holds the ButtonAction I passed earlier
}

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

unresolved external symbol "public: void __thiscall Button::Activate(void)" (?Activate@Button@@QAEXXZ) referenced in function "public: virtual void __thiscall TitleState::HandleEvents(void)" (?HandleEvents@TitleState@@UAEXXZ)

Я не уверен, в чем проблема, кроме того, что компоновщик не может найти определение функции. Все #included или объявлено правильно. Любая помощь приветствуется. Благодарю.

PS Когда я использовал установщик BoostPro, я устанавливал только однопоточные компоненты, но не многопоточные. Может ли это быть причиной, почему это не работает? Я читал, что проблемы компоновщика могут возникать, когда библиотеки связываются по-разному. Если это может быть проблемой, я добавлю, что я также использую библиотеку SFML.

2 ответа

Решение

Добавьте опцию библиотеки, когда вы связываете свою программу:

г ++:

g++ -L/your/library/path -lyour_library_name

VC++:

Я не уверен, в чем проблема. Все включено или заявлено правильно. Любая помощь приветствуется. Благодарю.

Это просто означает, что компилятор находит объявление. Но компоновщик должен найти определения символов. (См. Этот вопрос о разнице между объявлением и определением.) Вам необходимо предоставить его вместе с библиотекой. Если вы используете GCC, следуйте советам Фонга.

Другие вопросы по тегам