2010-01-17 10 views
6

J'ai ce qui suit dans le fichier d'en-tête.Référence indéfinie à la fonction non-membre - C++

namespace silc{ 
    class pattern_token_map 
    { 
     /* Contents */ 
    }; 

    pattern_token_map* load_from_file(const char*); 
} 

Dans le dossier du RPC (ce qui a eu une bonne comprend)

pattern_token_map* load_from_file(const char* filename) 
{ 
    // Implementation goes here 
} 

Dans un autre dossier du RPC. Cela a tout inclus correctement.

void some_method() 
{ 
    const char* filename = "sample.xml"; 
    pattern_token_map* map = load_from_file(filename); // Linker complains about this. 
} 

Je reçois une erreur de linker dire que la référence non définie à load_from_file. Je ne suis pas capable de voir ce qui ne va pas ici.

Toute aide serait appréciée.

compilateur: G ++ OS: Ubuntu 9,10

Modifier

Voici la commande de liaison utilisé.

g++ -L/home/nkn/silc-project/third_party/UnitTest++ -o tests.out src/phonetic_kit/pattern_token_map.o tests/pattern_token_map_tests.o tests/main.o -lUnitTest++ 

erreur est de pattern_token_map_tests.o et la fonction est disponible dans pattern_token_map.o. Donc, je suppose que l'ordre de liaison ne fait pas le problème. (J'ai supprimé des fichiers de la commande pour le simplifier) ​​

+0

Il vous manque les parens sur 'some_method'? –

+1

Impossible de dire à partir de ce que vous avez posté - s'il vous plaît ajouter la commande compilateur/éditeur de liens que vous utilisez. –

+0

Merci Neil. J'ai ajouté la commande d'éditeur de liens que j'utilise. C'est une version simplifiée de ce que j'ai. –

Répondre

9

Lorsque vous le mettre en œuvre, vous devez vous assurer que vous mettre en œuvre la fonction droite:

namespace silc { 
pattern_token_map* load_from_file(const char* filename) { 
    // Implementation goes here 
} 
} 

Si vous avez fait ceci au lieu:

using namespace silc; // to get pattern_token_map 
pattern_token_map* load_from_file(const char* filename) { 
    // Implementation goes here 
} 

Ensuite, vous seriez en train de définir une nouvelle fonction plutôt que silc :: load_from_file.

Évitez d'utiliser des directives ("using namespace ...;") en dehors du champ d'application de la fonction, en règle générale:

using namespace silc; // outside function scope: avoid 

silc::pattern_token_map*      // qualify return type 
random_function(silc::pattern_token_map* p) { // and parameters 
    using namespace silc; // inside function scope: fine 
    pattern_token_map* p2 = 0; // don't have to qualify inside the function 
          // if you want to use the using directive 
    silc::pattern_token_map* p3 = 0; // but you can always do this 
    return 0; 
} 
+0

Merci. En disant "Évitez d'utiliser des directives (" using namespace ...; ") en dehors des fonctions.", Voulez-vous dire que vous évitez de l'écrire en haut des fichiers cpp. Ecrivez-le à l'intérieur de chaque fonction à la place. C'est ce que vous vouliez dire? –

+1

Oui, si vous voulez l'utiliser dans une fonction, c'est bien. Vous en avez rarement besoin de toute façon, car vous pouvez utiliser le formulaire dans mon premier morceau de code pour implémenter vos fonctions dans les fichiers cpp. –

+1

Je n'avais pas pensé à restreindre les directives 'using' à l'intérieur des corps de fonctions. +1 –

0

Dans votre phase de liaison, créez-vous des liens dans le fichier objet créé en compilant le premier fichier cpp? Les erreurs de lieur comme celles-ci se produisent lorsqu'un objet référence un symbole qui n'est pas inclus dans les objets liés.

Editer: Je suis toujours raisonnablement confiant que c'est le problème. Dans le premier fichier, existe-t-il un symbole de préprocesseur redéfinissant load_from_file?

+0

Oui. Je lie tous les fichiers objets. Ajout de la commande de l'éditeur de liens. Jetez un coup d'oeil s'il vous plait. –

Questions connexes