Question

Ceci est une application de console Windows (en fait un service) qu'un gars précédent a construit il y a 4 ans et est installé et en cours d'exécution. Je dois maintenant faire quelques changements mais je ne peux même pas construire la version actuelle! Voici le résultat de la construction:

--------------------Configuration: MyApp - Win32 Debug--------------------
Compiling resources...
Compiling...
Main.cpp
winsock.cpp
Linking...
LINK : warning LNK4098: defaultlib "LIBCMTD" conflicts with use of other libs; use /NODEFAULTLIB:library
Main.obj : error LNK2001: unresolved external symbol _socket_dontblock
Debug/MyApp.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

MyApp.exe - 2 error(s), 1 warning(s)
--------------------------------------------------------------------------

Si j'utilise / NODEFAULTLIB , je reçois beaucoup d'erreurs. Le code n'utilise pas réellement _socket_noblock mais je ne trouve rien dessus sur le net. Vraisemblablement, il est utilisé par une bibliothèque vers laquelle je me connecte mais je ne sais pas dans quelle bibliothèque il se trouve.

--- Alistair.

Était-ce utile?

La solution 2

Désolé, cela s’avère être un problème interne. Une combinaison d'un codeur non-conformiste il y a 4 ans et d'un non-rien rouillé (moi!) Maintenant.

Le code n'utilise pas _socket_noblock , mais il utilise socket_noblock et il me suffit de créer un lien vers l'une de nos propres bibliothèques.

Autres conseils

LNK4098 peut ne pas être un problème. Par exemple, cela peut se produire si vous vous associez à une version publiée de certaines bibliothèques, qui utilise une liaison statique au moment de l'exécution et entraîne LIBCMT (notez l'absence de suffixe "D") à ajouter aux bibliothèques par défaut. Votre application, construite dans la configuration de débogage, utilise LIBCMT D , d'où le conflit. Il peut être réellement sûr, à condition que vous n’échangiez aucun élément dépendant de l’exécution avec cette bibliothèque.

En ce qui concerne _socket_noblock , vous pouvez utiliser un utilitaire de recherche (tel que grep ou find) pour rechercher cette chaîne dans les fichiers .obj et .lib. De cette façon, vous saurez quelle bibliothèque fait référence au symbole, ce qui peut constituer un point de départ pour découvrir les dépendances de cette bibliothèque.

Vous pouvez utiliser "Dependency Walker" & ; un outil gratuit permettant de rechercher les dépendances de votre application, pour savoir comment votre application crée un lien vers libcmtd. Modifier : vous ne pouvez bien entendu pas l'utiliser sur la nouvelle version qui ne crée pas de lien (voir les commentaires), mais vous pouvez l'utiliser sur l'ancienne version ou sur les bibliothèques connues que la nouvelle version liens avec.

Cependant, comme le vrai problème n'avait aucun rapport avec ce que j'ai suggéré, la question devrait peut-être être close.

Il semble que vous vous connectiez à différentes versions du tube cathodique - peut-être parce que vous utilisez d'anciennes bibliothèques construites avec un nouveau compilateur et une nouvelle version du tube cathodique.

defaultlib " LIBCMTD " conflits avec l'utilisation d'autres bibliothèques est un avertissement indiquant que votre programme utilise une version différente de la bibliothèque d'exécution une ou plusieurs de vos bibliothèques. Utilisez le même temps d'exécution pour le programme et les bibliothèques, pour que l'avertissement disparaisse.

(paramètres du projet) (onglet c ++) catégorie (génération de code) (utiliser la bibliothèque d'exécution)

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