2010-02-20 17 views
0

J'utilise boost::function pour activer le passage d'une fonction à un constructeur Button afin qu'il contienne cette fonction. Appelez-le chaque fois qu'il est activé.symbole externe non résolu "public: void __thiscall ..."

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

Dans mon TitleState j'ai construit un bouton comme celui-ci.

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) 
) 

où ButtonAction est une fonction static void privée dans l'en-tête de TitleState, défini dans le fichier de mise en œuvre simplement la sortie à la console via std :: Cout (comme un test pour savoir si elle fonctionne).

Dans mon code, si la souris clique sur un bouton dans la fonction HandleEvents de TitleState, le programme appelle la fonction Activate du bouton qui ressemble à ceci.

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

Le problème est que, lorsque le programme essaie de lier je reçois cette erreur ....

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

Je ne suis pas sûr de ce que le problème est d'ailleurs que l'éditeur de liens peut » t trouver la définition de la fonction. Tout est #included ou déclaré correctement. Toute aide est appréciée. Merci.

P.S. Lorsque j'ai utilisé le programme d'installation de BoostPro, j'ai seulement installé le matériel à un seul thread et aucun des composants multi-thread. Cela pourrait-il être une raison pour laquelle cela ne fonctionne pas? J'ai lu que les problèmes de liens peuvent se produire lorsque les bibliothèques sont liées de différentes manières. Si cela peut être un problème, j'ajouterai que j'utilise aussi la bibliothèque SFML.

Répondre

2

Ajouter l'option de bibliothèque lorsque vous liez votre programme:

g ++:

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

vC++:

+0

Ce n'est pas le problème. Les bibliothèques sont liées. – Person

+1

Non, ils ne le sont pas. Si c'était le cas, l'éditeur de liens mentirait. Et les linkers ne le font pas. – sbi

+0

Dans les propriétés du projet, sous lieur, sous les répertoires de bibliothèque supplémentaires, j'ai mis en C: \ boost_1_42 \ lib C'était toute la documentation de boost a été nécessaire lors de la liaison en utilisant VC++. – Person

0

Je ne suis pas sûr quel est le problème. Tout est inclus ou déclaré correctement. Toute aide est appréciée. Merci.

Cela signifie simplement que le compilateur trouve la déclaration. Mais le lieur doit trouver les définitions des symboles. (Voir this SO question pour quelle est la différence entre une déclaration et une définition.) Vous devez le fournir avec la bibliothèque. Si vous utilisez GCC, suivez Phong's advice.

+0

Je devrais probablement avoir ajouté, je comprends que l'éditeur de liens ne peut pas trouver la définition, mais je ne sais pas pourquoi. La définition est clairement fournie. Je n'utilise pas GCC. – Person

+0

Quel compilateur utilisez-vous? – Phong

+0

J'utilise VC++. – Person