Question

  

Possible en double:    Qu'est-ce qu'un non défini référence / erreur de symbole externe non résolu et comment puis-je résoudre ce problème?

Je travaille sur l'emballage d'un grand nombre de .h et .lib de C ++ natif pour C ++ géré pour une éventuelle utilisation comme référence .dll en C #.

Je les fichiers .lib liés et tout se déroule sans problème jusqu'à présent. 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 __imp__htonl@4 referenced in function
"public: void __thiscall Field::setCharacter(unsigned char,int)"
(?setCharacter@Field@@QAEXEH@Z) 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 est que j'ai environ 20 fonctions dans ce cas particulier .h et tout le reste sont un lien très bien à l'exception des 3 fonctions.

Toutes les idées?

Était-ce utile?

La solution

Le symbole manquant est __imp__htonl@4, qui est un nom C de mutilée pour htonl, qui est une fonction qui convertit une longue valeur de l'hôte à commande réseau. Le @ 4 est utilisé pour modifier les paramètres d'entrée et fait partie de l'appui de C pour les fonctions surchargées pour permettre à l'éditeur de liens pour régler la bonne fonction w / o collisions nom.

Assurez-vous que vous êtes lié à la bibliothèque de réseau que vous faites référence à ce symbole de. On peut supposer que votre paquet utilise une définition particulière de ce symbole, au lieu de la macro qu'il est habituellement.

Autres conseils

Êtes-vous sûr que le match de signatures? Assurez-vous de vérification Signed-ness et const-ness. Aussi, assurez-vous que les fonctions ne sont pas inline.

Je suis tombé sur cette erreur quand je compilé une bibliothèque, puis changé la bibliothèque avant de lier. Assurez-vous que vos en-têtes sont les mêmes que ceux fournis par votre bibliothèque (non copiée d'une autre architecture, etc.). Bien sûr, assurez-vous que vous liez contre Ws2_32.lib (-lws2_32 pour MinGW / gcc).

En outre, si vous utilisez GCC / MinGW vous pouvez jeter un oeil à ceci:

scroll top