6
votes

Symbole externe non résolu

Dupliqué possible:
Qu'est-ce qu'un indéfini Référence / erreur de symbole externe non résolue et comment puis-je réparer?

Je travaille sur l'enveloppement d'un grand nombre de fichiers .h et .lib de Native C ++ à gérer C ++ pour une utilisation éventuelle en tant que référencée .dll in c #.

J'ai les fichiers .lib liés à Et tout se passe bien en douceur jusqu'à présent. Lors de l'enveloppement du dernier fichier .h, j'ai frappé un accrochable lorsque 2 fonctions sont revenues avec l'erreur de liaison: xxx

J'ai référencé myutils.lib Dans les options de liaison, cela ne devrait pas être le problème.

Qu'est-ce que j'ai d'environ 20 fonctions dans ce fichier particulier .h et tout le reste se connecte parfaitement à l'exception de 3 fonctions.

Des idées?


2 commentaires

Pourriez-vous poster le code des fonctions qui ne relient pas (et peut-être de l'une des celles de comparaison)?


"... Donc, cela ne devrait pas être le problème." -> "devrait" est un mot dangereux puissant dans la plupart des cas;)


3 Réponses :


1
votes

Êtes-vous sûr que les signatures correspondent? Assurez-vous de vérifier la signature et la const-ness. En outre, assurez-vous que des fonctions ne sont pas inlinées.


2 commentaires

Du fichier .h Fichier: VOID SetCharacter (non signé Char C, int statbit); À partir de l'enveloppe: void SetCharacter (non signé Char c, int statbit) {m_natiffield-> setchariger (c, startbit); }; De ma compréhension, les fonctions doivent être entièrement définies dans le fichier LIB que je référencement. Je peux fournir l'exportation du symbole si cela aiderait aussi. Est-ce que quelqu'un sait comment déchiffrer la sortie de code de la liaison ... c'est-à-dire qu'est-ce que "__imp__htonl @ 4", etc. signifie?


Les trois fonctions ne sont-elles pas exportées tous les doublons comme celui-ci? Sont-ils les seules fonctions courtes?



6
votes

Le symbole manquant est __ IMPOHTONL @ 4 , qui est un nom c ++ mutilé pour Htonl, qui est une fonction qui convertit une valeur longue de l'hôte à la commande réseau. Le @ 4 est utilisé pour mangler les paramètres d'entrée et fait partie de la prise en charge de C ++ pour les fonctions surchargées afin de permettre à la lieur de résoudre la fonction de la fonction de la bonne fonction avec les collisions de noms.

Assurez-vous que vous êtes lié à la bibliothèque de réseau que vous référenciez ce symbole. Vraisemblablement, votre colis utilise une définition spéciale de ce symbole, au lieu de la macro qu'elle est habituellement.


1 commentaires

Merci Christopher. En plus de plus près, __Imp__Htonl fait partie d'une bibliothèque déjà sur la machine. J'ai ajouté: "#pragma commentaire (lib," ws2_32.lib ")" à l'en-tête Wrapper et ça marche!



1
votes

J'ai rencontré cette erreur lorsque j'ai compilé contre une bibliothèque, puis modifié la bibliothèque avant de relier la liaison. Assurez-vous que vos en-têtes sont les mêmes que ceux fournis par votre bibliothèque (non copiés d'une autre architecture, etc.). Bien sûr, assurez-vous de vous connecter à WS2_32.LIB (-LWS2_32 pour MINGW / GCC).

En outre, si vous utilisez GCC / MINGW, vous voudrez peut-être jeter un coup d'œil à ceci: Erreur de liaison MINGW: winsock


0 commentaires