Question

J'ai essayé de rechercher des problèmes similaires, mais je n'ai pas pu en trouver facilement un qui ait résolu mon problème.

J'ai créé un projet en C ++ et je travaille sous UNIX pour le compiler, le lier et l'exécuter. Mon problème spécifique est une référence non définie à une méthode que je déclare dans un fichier séparé.

Dans le fichier SharedCache.cpp, j'ai la méthode suivante:

int SharedCache::replaceLine(ullong address){
    int evictPID = -1;

    int cacheSet = calcCacheSet( address );
    //random uniformly-distributed value for cache line
    float numLines = static_cast<float>(CACHE_LINES_PER_SET);
    uint cacheLine = static_cast<uint>(uniformDistr( numLines ));

    if(cache[cacheSet][cacheLine] != NULL){
        evictPID = cache[cacheSet][cacheLine]->PID;
    }

    uint PID= calcPID(address);
    uint tag= calcTag(address);

    cache[cacheSet][cacheLine]->setLine(PID, tag); //mutex method

    return PID;
}

La ligne uint cacheLine = static_cast<uint>( uniformDistr( numLines )); appelle la fonction que je veux utiliser depuis un autre fichier. L'erreur de l'éditeur de liens est une référence non définie à cette méthode.

uniformDistr (float); est déclaré dans l'en-tête distributions.h et défini dans distributions.cpp. Dans mes options de projet, j'ai défini les distributions d'indicateur de l'éditeur de liens et j'ai également compilé le fichier distributions.cpp pour m'assurer qu'un fichier distributions.o existait déjà.

D'ici, je ne sais pas où aller, car cela n'a pas résolu le problème.

Était-ce utile?

La solution

Je n'ai pas utilisé KDevelop, cependant, sur la ligne de commande, vous ajouteriez simplement distributions.o en tant que fichier d'entrée dans le processus de liaison. Pas besoin de tirets ou de laisser l'extension .o.

Sinon, pouvez-vous simplement ajouter distributions.cpp à votre projet KDevelop? De cette façon, il devrait être compilé et lié automatiquement (c’est ainsi que cela fonctionne dans Visual Studio ou Eclipse, par exemple).

Autres conseils

Sans des informations plus précises sur les commandes du compilateur / éditeur de liens et sur les sorties d'erreur exactes, il est difficile de fournir une bonne réponse.

Cependant, d'après votre description de ce que vous avez fait, il semble que vous ne passez pas distributions.o à l'éditeur de liens. Contrairement aux autres langages dans lesquels le compilateur / éditeur de liens recherche les fichiers objets à associer automatiquement, les lieurs C ++ nécessitent une spécification explicite des objets à associer.

Votre utilisation de -ldistributions ici est incorrecte: l'indicateur -l est utilisé pour créer un lien vers une bibliothèque statique ou dynamique (respectivement des fichiers .a et .so sous Linux), alors que vous souhaitez spécifier un autre fichier objet que l'éditeur de liens doit prendre en compte. Si vous spécifiez -ldistributions, l’éditeur de liens recherche distributions.a ou distributions.so dans les emplacements de bibliothèque standard.

En gros, votre invocation de l'éditeur de liens ressemble maintenant à ceci (probablement avec beaucoup plus de drapeaux et de bibliothèques):

gcc -o my_program SharedCache.o -ldistributions

Pour lier correctement le code de la distribution, vous devez lui donner un aspect similaire (encore une fois, de nombreux indicateurs et bibliothèques sont probablement absents par rapport à la réalité):

gcc -o my_program SharedCache.o distributions.o

Ceci devrait résoudre le problème des symboles manquants et produire un binaire fonctionnel (ou tout au moins une erreur différente ;-)). Comment faire cela dans KDevelop mais je ne le sais pas.

Avez-vous ajouté le fichier distributions.cpp à votre fichier makefile? De plus, je pense que l'indicateur de l'éditeur de liens requis est -ldistributions.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top