2009-07-20 6 views
4

Possible Duplicate:
What is an undefined reference/unresolved external symbol error and how do I fix it?Symbole externe non résolu

Je travaille sur l'encapsulation d'un grand nombre de fichiers .h et .lib du C++ natif au format C++ managé en vue d'une utilisation éventuelle en tant que fichier .dll référencé en C#.

J'ai les fichiers .lib liés et tout s'est bien déroulé jusqu'ici. Lors de l'emballage le dernier fichier .h, j'ai frappé un accroc quand 2 fonctions sont revenus avec l'erreur de lien:

error LNK2019: unresolved external symbol [email protected] referenced in function 
"public: void __thiscall Field::setCharacter(unsigned char,int)" 
([email protected]@@[email protected]) myutils.lib 

J'ai référencé myutils.lib dans les options de l'éditeur de liens, de sorte que ne devrait pas être la question. Ce qui est étrange, c'est que j'ai environ 20 fonctions dans ce fichier .h particulier et que tout le reste est bien lié à l'exception de 3 fonctions.

Des idées?

+0

Pouvez-vous poster le code des fonctions qui ne sont pas de liaison (et peut-être de l'un des ceux qui sont en comparaison)? – Sean

+0

"... ce qui ne devrait pas être le problème." -> "Devrait" est un mot dangereux puissant dans la plupart des cas;) –

Répondre

4

Le symbole manquant est [email protected], qui est un nom C++ tronqué pour htonl, qui est une fonction qui convertit une valeur longue entre l'hôte et l'ordre réseau. Le @ 4 est utilisé pour modifier les paramètres d'entrée et fait partie de la prise en charge C++ pour les fonctions surchargées afin de permettre au lieur de résoudre la bonne fonction sans collisions de noms.

Assurez-vous que vous êtes lié à la bibliothèque réseau à partir de laquelle vous faites référence à ce symbole. Vraisemblablement votre paquet utilise une définition spéciale de ce symbole, au lieu de la MACRO qu'il est habituellement.

+6

Merci Christopher. En regardant de plus près, __imp__htonl fait partie d'une bibliothèque déjà sur la machine. J'ai simlpy ajouté: "#pragma comment (lib," Ws2_32.lib ")" à l'entête d'emballage et cela fonctionne! – TomO

1

Êtes-vous sûr que les signatures correspondent? Assurez-vous de vérifier la signature et la constance. Assurez-vous également que les fonctions ne sont pas en ligne.

+0

Du fichier .h: void setCharacter (unsigned char c, int startBit); De l'enveloppe: setCharacter void (c unsigned char, int bit de départ) \t {\t \t m_NativeField-> setCharacter (c, bit de départ); \t}; D'après ce que je comprends, les fonctions devraient être entièrement définies dans le fichier lib que je référence. Je peux fournir l'exportation de symbole si cela peut aider aussi. Est-ce que quelqu'un sait comment déchiffrer la sortie de code de l'éditeur de liens ... c'est-à-dire, que signifie "__imp__htonl @ 4", etc. – TomO

+0

Est-ce que les trois fonctions qui ne sont pas exportées sont toutes comme une ligne? Sont-ils les seules fonctions courtes? – eduffy

1

J'ai rencontré cette erreur lorsque j'ai compilé contre une bibliothèque, puis j'ai modifié la bibliothèque avant de la lier. Assurez-vous que vos en-têtes sont les mêmes que ceux fournis par votre bibliothèque (pas copiés d'une autre architecture, etc.). Bien sûr, assurez-vous que vous êtes lié à ws2_32.lib (-lws2_32 pour mingw/gcc).

De plus, si vous utilisez GCC/MinGW vous pouvez jeter un oeil à ceci: MinGW linker error: winsock

Questions connexes